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 に答える