2013-04-11 61 views
0

有我的代碼和屏幕截圖來創建遮罩,看起來很奇怪,遮罩的大小沒有覆蓋原始幀。請提供任何提示嗎?OpenCV/C++矩形遮罩不能覆蓋原始幀的所有區域

*cap >> frame1; 
    Rect roi(100,100,100,100); 
    for(int i =0; i<frame1.rows; i++) 
    { 
     for(int j=0; j<frame1.cols;j++) 
     { 
      if(!roi.contains(Point(i,j))) 
      { 
       frame1.at<uchar>(i,j) = 0; 
      } 
     } 
    } 

enter image description here

回答

0

我的假設是,frame1是彩色圖像,且類型爲CV_8UC3。 嘗試創建,並在此代碼段填寫frame1frame_gray

cv::Mat3b frame_color; 
*cap >> frame_color; 
cv::Mat1b frame_gray; 
cv::cvtColor(frame_color, frame_gray, CV_BGR2GRAY) 

,或者如果你不喜歡改變frame1類型使用下面的代碼:

*cap >> frame1; 
Rect roi(100,100,100,100); 
for(int i =0; i<frame1.rows; i++) 
{ 
    for(int j=0; j<frame1.cols;j++) 
    { 
     if(!roi.contains(Point(i,j))) 
     { 
      frame1.at<cv::Vec3b>(i,j) = cv::Vec3b::all(0); 
     } 
    } 
} 

或者更短(沒有測試,但想法應該清楚):

*cap >> frame1; 
Rect roi(100,100,100,100); 
cv::Mat3b color_mask = cv::Mat3b::ones(frame1.size()); 
color_mask(roi) = cv::Mat3b::zeros(roi.size()); 
frame1 = frame1.mul(color_mask); 
+0

你是對的,'frame1'是一個彩色圖像,但它可能實現它沒有改變圖像的類型,我的意思是在原始圖像中創建一個蒙版? – user1959079 2013-04-11 16:01:44

+0

非常感謝你,它運作良好! – user1959079 2013-04-11 16:33:06