2013-08-27 43 views
3

我目前正在嘗試將找到的圈外的所有內容全部禁用。 目前,我畫與下面的代碼行的圓圈:如何在開放式CV中圈出圈外的所有內容

cv::Point center(cvRound(circles[i][0]), cvRound(circles[i][1])); // CVRound converts floating numbers to integer 
int radius = cvRound(circles[i][2]);        // Radius is the third parameter [i][0] = x [i][1]= y [i][2] = radius 
circle(image, center, 3, cv::Scalar(0,255,0), -1, 8, 0);  // Drawing little circle to Image Center , next Line of Code draws the real circle 
circle(image, center, radius, cv::Scalar(0,0,255), 3, 8, 0); // Circle(img, center, radius, color, thickness=1, lineType=8, shift=0) 

但是,這不是我所期待的。如果我有半徑和圓圈的中心點,這是繪製我的墊子其餘部分的最佳方法。 提供OpenCV這樣做的一個簡單的方法,或者我應該遍歷我的圖像的所有像素,並根據位置顏色他們黑或不?

+4

創建掩模圖像(只畫黑色圖像上的白色圓圈,大小與原始圖像的大小相同),然後在圖像和蒙版中使用bitwise_and()。 –

回答

6

由於阿比德的提示,我結束了這種方法。一切正常:

cv::Mat src = someMethodThatReturnsSrcImage(); // src Image 
cv::Mat maskedImage; // stores masked Image 
std::vector<cv::Vec3f> circles = someMethodThatReturnsCircles(src);  
cv::Mat mask(srcImageForDimensions.size(),srcImageForDimensions.type()); // create an Mat that has same Dimensons as src 
mask.setTo(cv::Scalar(0,0,0));           // creates black-Image 
    // Add all found circles to mask 
for(size_t i = 0; i < circles.size(); i++)       // iterate through all detected Circles 
     { 
     cv::Point center(cvRound(circles[i][0]), cvRound(circles[i][1])); // CVRound converts floating numbers to integer 
     int radius = cvRound(circles[i][2]);        // Radius is the third parameter [i][0] = x [i][1]= y [i][2] = radius 
     cv::circle(mask, center, radius, cv::Scalar(255,255,255),-1, 8, 0); // Circle(img, center, radius, color, thickness=1, lineType=8, shift=0) 
     } 

src.copyTo(maskedImage,mask); // creates masked Image and copies it to maskedImage 
2

可以使背景的顏色你想

image=cv::Scalar(red_value, green_value, blue_value); 

然後繪製你的圈子

0

只是想你的代碼段和它的作品。 此外,如果你想改變背景顏色,而不是黑色,按OpenCV的文檔herecopyTo之前,如果需要的目的地墊將被初始化,所以只需添加如下代碼:

cv::Mat maskedImage(srcImageForDimensions.size(), srcImageForDimensions.type()); // stores masked Image 
maskedImage.setTo(cv::Scalar(0,0,255)); // set background color to red