Настройка прозрачности в OpenCV не работает

Я устанавливаю прозрачность для четырехканального Mat вот так (на основе некоторых расчетов). Но когда я показываю изображение в окне, для Image не происходит никаких изменений. Любая помощь была бы отличной поддержкой.

void feather_touch(Rect enclosingRect, Mat frame){

    Point center(frame.size().width * 0.5, frame.size().height * 0.5);
    int inclussive_circle_radius = (sqrt((frame.cols * frame.cols + frame.rows * frame.rows))) / 2;
    for(int i = 0; i < frame.rows; i++){
        for(int j = 0; j < frame.cols; j++){
            Point point(i, j);
            if(!inRect(point, enclosingRect)){
                Vec4b channels = frame.at<Vec4b>(i, j);
                int dx   = center.x - point.x;
                int dy   = center.y - point.y;
                int dist = sqrt((dx * dx) + (dy * dy));
                float alpha = (float)dist/(float)inclussive_circle_radius;
                int a = (int)((1 - alpha) * 255);
                frame.at<Vec4b>(i, j)[3] = a;
            }
        }
    }
}


bool inRect(cv::Point p,Rect rect) {
    return p.x >= rect.x && p.x <= (rect.x + rect.width) && p.y >= rect.y && p.y <= (rect.y + rect.height);
}

person Triode    schedule 20.07.2013    source источник


Ответы (1)


Но я получил ответ: imshow в OpenCV не поддерживает прозрачность.
Я заменил его, применив addWeighted функциональность. Теперь моя функция выглядит так:

float alpha = ((float)dist/(float)inclussive_circle_radius);
//int a = (int)((1 - alpha) * 255);
//frame.at<Vec4b>(i, j)[3] = a;
Rect rect(j, i, 1, 1);
Mat mat = frame(rect);
Mat sub = layer(rect);

if(dist > (enclosingRect.width*0.5)){
    addWeighted(mat, alpha, sub, 1 - alpha, 0, mat);
    mat.copyTo(frame(rect));
}else{
    sub.copyTo(frame(rect));
}
person Triode    schedule 21.07.2013