2012-12-20 75 views
0

我試圖找出框架的某些區域,該框架位於Ycbcr色彩空間中。我必須根據它們的Y值來選擇這些區域。在某些像素上繪製矩形openCV

所以我寫了這個代碼:

Mat frame. ychannel; 
VideoCapture cap(1); 
int key =0; 
int maxV , minV; 
Point max, min; 
while(key != 27){ 
    cap >> frame; 
    cvtColor(frame,yframe,CV_RGB_YCrCb); // converting to YCbCr color space 
    extractChannel(yframe, yframe, 0); // extracting the Y channel 
    cv::minMaxLoc(yframe,&minV,&maxV,&min,&max); 
    cv::threshold(outf,outf,(maxV-10),(maxV),CV_THRESH_TOZERO); 
/** 
Now I want to use : 
cv::rectangle() 
but I want to draw a rect around any pixel (see the picture bellow)that's higher than (maxV-10) 
and that during the streaming 
**/ 
    key = waitKey(1); 
} 

我畫這幅畫跳躍,它有助於瞭解什麼我做什麼。

enter image description here

感謝您的幫助。

回答

3

你必須找到每個connected components,並繪製它們的邊界框。

+0

謝謝你回答阿迪,但你能解釋嗎? – Engine

+0

鏈接是OpenCV的findContours()函數。 @Chris拼出來了。 –

4

一旦你應用了閾值,你將得到一個包含connected components數字的二進制圖像,如果你想圍繞每個組件繪製一個矩形,那麼你首先需要檢測這些組件。

OpenCV函數​​就是這樣做的,將它傳遞給你的二進制圖像,它將爲你提供一個向量點向量,它可以跟蹤圖像中每個元素的邊界。

cv::Mat binaryImage; 
std::vector<std::vector<cv::Point>> contours; 

cv::findContours(binaryImage, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE) 

然後,所有你需要做的就是找到每個這些點集的bounding rectangle,並吸引他們到你的輸出圖像。

for (int i=0; i<contours.size(); ++i) 
{ 
    cv::Rect r = cv::boundingRect(contours.at(i)); 
    cv::rectangle(outputImage, r, CV_RGB(255,0,0)); 
} 
+0

感謝克里斯的幫助,你我可以改變cv :: boundingRect的尺寸嗎? – Engine

+0

你是什麼意思改變尺寸? cv :: boundingRect是一個返回最小大小矩形的函數,它包含了作爲其參數傳遞的點數組。一旦你有了這個矩形(在我的例子中是cv :: Rect r),你可以做你喜歡的東西。 – Chris

+1

請注意,還有其他類似的函數(在文檔的同一頁上)適合其他形狀的點,包括fitEllipse(),convexHull(),minAreaRect()和minEnclosingCircle()。看看[文檔](http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html)並找到最合適的。 – Chris