0

我正在尝试定位框架的某些区域,该框架位于 Ycbcr 颜色空间中。我必须根据它们的 Y 值选择这些区域。

所以我写了这段代码:

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

我画了这幅画,它有助于理解我要做什么。

在此处输入图像描述

谢谢你的帮助。

4

2 回答 2

4

一旦你应用了你的阈值,你最终会得到一个包含多个 的二进制图像connected components,如果你想在每个组件周围绘制一个矩形,那么你首先需要检测这些组件。

OpenCV 函数findContours就是这样做的,将您的二进制图像传递给它,它将为您提供一个点向量的向量,这些点跟踪图像中每个组件的边界。

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

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

然后你需要做的就是找到每组点的边界矩形并将它们绘制到你的输出图像上。

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));
}
于 2012-12-20T16:21:34.917 回答
3

您必须找到每个连接的组件,并绘制它们的边界框。

于 2012-12-20T14:53:26.987 回答