我正在尝试定位一些帧的某些区域,该帧位于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);
}
我画了这张图片,它有助于理解我该做什么。
感谢您的帮助。
答案 0 :(得分: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)
然后您需要做的就是找到每组点的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));
}
答案 1 :(得分:3)
您必须找到connected components中的每一个,并绘制其边界框。