2013-07-20 41 views
1

我爲四個通道設置透明度Mat(基於一些計算)。但是當我在窗口上顯示圖像時,圖像沒有發生變化。任何幫助將是一個很好的支持。在OpenCV中設置透明度不起作用

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); 
} 
+0

的可能重複[OpenCV的:如何設置一個像素的阿爾法透明度(http://stackoverflow.com/questions/16196312/opencv-how-to-set-alpha -transparency對的一像素) – Aurelius

回答

2

我得到了答案: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)); 
}