3

フレームから輪郭を取得しようとしていますが、これが私が行ったことです:

 cv::Mat frame,helpframe,yframe,frame32f;
 Videocapture cap(1); 
.......
while(waitkey()){
cv::Mat result = cv::Mat::zeros(height,width,CV_32FC3);
cap >> frame; // get a new frame from camera
frame.convertTo(frame32f,CV_32FC3);
for ( int w = 0; w< 10;w ++){
            result += frame32f;
        }   
         //Average the frame values.
        result *= (1.0/10);
        result /= 255.0f;
cvtColor(result,yframe,CV_RGB2YCrCb); // converting to Ycbcr///// the code work fine when I use frame instead of result 
extractChannel(yframe,helpframe,0); //extracting the Y channel
cv::minMaxLoc(helpframe,&minValue,&maxValue,&min,&max);
std::vector<std::vector<cv::Point>> contours;
cv::findContours(helpframe, contours,CV_RETR_LIST /*CV_RETR_EXTERNAL*/, CV_CHAIN_APPROX_SIMPLE);

................................................................... ..

でプログラムがクラッシュしfindcontours、デバッグすると、次のエラー メッセージが表示されます。

OpenCV エラー: サポートされていない形式または形式の組み合わせ ([Start]FindContours は 8uC1 と 32sC1 のイメージのみをサポートします)、不明な関数、ファイル ......\src\openc v\modules\imgproc\src\contours.cpp、196 行目

@Nikoヘルプフレームを別のタイプに変換する必要があると思います。結果を使用する と helpframe.type() => 5 で取得し、フレーム で 0 を取得すると、
それが何を意味するのかわかりませんか? しかし、ヘルプフレームを変換する方法を見つけようとします。

ヘルプフレームを変換した後: helpframe.convertTo(helpframe2,CV_8U)

私は何も得られません helpframe2 is = 0 ?? 結果フレームの代わりにフレームで同じことを試みると、変換は機能しますか??

フレームの代わりに結果を使用するため、ヘルプフレームのタイプを変更する方法はありますか?

4

1 に答える 1

7

輪郭を識別する前に、イメージをバイナリ イメージに縮小する必要があります。これは、たとえば、ある種のエッジ検出アルゴリズムを適用するか、単純なしきい値処理によって行うことができます。

// Binarize the image
cv::threshold(helpframe, helpframe, 50, 255, CV_THRESH_BINARY);

// Convert from 32F to 8U
cv::Mat helpframe2;
helpframe.convertTo(helpframe2, CV_8U);

cv::findContours(helpframe2, ...);
于 2013-01-08T11:24:44.413 に答える