0

輪郭を一連の多角形曲線に変換しようとしていますが、approxPolyDP 関数を使用しようとするとスタックします。まず、findContours が適切に機能するかどうかをテストし、画像に輪郭を描画しようとしました。contourIdx = 0 で機能します。次に、例に示すように approxPolyDp を使用してみます: shapedescriptors/bounding_rects_circles/bounding_rects_circles.html

しかし、実行中に、ベクタークラスと機能サイズ()に関連するエラー「アクセス違反」が発生しました。これが私のコードです:

IplImage* image = cvLoadImage("F:\\triangle.png");
waitKey(5000);
//Mat img = imread("triangle.png");
Mat img(image,true);

if(!img.data)
{
    cout <<"image file not found";
      cv::waitKey(5000);
   return -1;
}

//namedWindow( "window", 0 );
//imshow( "window", img );
cvNamedWindow("window");
cvShowImage("window",image);

Mat imgGray;
Mat imgEdges;

cvtColor(img,imgGray,CV_BGR2GRAY);
blur(imgGray,imgGray,Size(3,3));
threshold(imgGray,imgEdges,128,255,CV_THRESH_BINARY);

Mat canny_output;
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;

/// Detect edges using canny
Canny( imgGray, canny_output,100, 100*2, 3 );
/// Find contours
findContours( canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );

 /// Draw contours
 RNG rng(12345);
 Mat drawing = Mat::zeros( canny_output.size(), CV_8UC3 );

 if (drawing.type() != CV_8UC3)
 {
  cout << "Error: image type different then CV_8UC3";
 }

   Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
   drawContours( drawing, contours, 0, color, 2, 8, hierarchy, 0, Point() );


 IplImage img3 = drawing;
 cvNamedWindow( "Contours", CV_WINDOW_AUTOSIZE );
 cvShowImage( "Contours", &img3 );

 vector<vector<Point>> contoursOUT/*(contours.size())*/;

 approxPolyDP(Mat(contours[0]),contoursOUT,3,true );


waitKey(0);
return 0;

ここで何が問題なのか誰にもわかりませんか?

4

2 に答える 2

4

OpenCV-doc は次のように述べていapproxPolyDPます。

void approxPolyDP (InputArray curve, 
                   OutputArray approxCurve, 
                   double epsilon, 
                   bool closed) 

approxCurve - ... タイプは入力曲線のタイプと一致する必要があります。...

したがって、実装の最後の部分は次のようになります。

vector<Point> contoursOUT;
approxPolyDP( Mat(contours[0]), contoursOUT, 3, true );

この小さな変更を加えてコードをテストすると、妥当な結果がコンパイルされて出力されます。

于 2014-01-10T13:43:38.430 に答える