2016-10-18 11 views
0

私は現在学生のための埋め込みビジョンプロジェクトに取り組んでいますが、&ジャーナリストですが、問題があります。 は、私は言ってエラーを得た:OPENCV/C++:approxpolydpアサーションにエラーが発生しました

Rect bounding_rect; 
     Mat drawing = Mat::zeros(threshold_output.size(), CV_8UC3); 
     for(int i = 0; i< contours.size(); i++) 
      { 
// Find the largest area of contour, and the bounding rect for the largest contour 
      double a=contourArea(contours[i],false); 
      if(a>largest_area) 
       { 
       largest_area=a;cout<<i<<" area "<<a<<endl; 
       largest_contour_index=i;    
       bounding_rect=boundingRect(contours[i]); 
       } 
      Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255)); 
//drawContours(drawing, contours_poly, i, color, 1, 8, vector<Vec4i>(), 0, Point()); 
      rectangle(drawing, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0); 
      drawContours(src, contours_poly, i, color, 1, 8, vector<Vec4i>(), 0, Point()); 

      } 
     approxPolyDP(Mat(contours[largest_contour_index]), contours_poly[0],20, true); 

それともそれが理由である:

OpenCV Error: Assertion failed (npoints >= 0 && (depth == CV_32S || depth == CV_32F)) in approxPolyDP, file /home/linuxu/OpenCV/modules/imgproc/src/approx.cpp, line 679 terminate called after throwing an instance of 'cv::Exception' what(): /home/linuxu/OpenCV/modules/imgproc/src/approx.cpp:679: error: (-215) npoints >= 0 && (depth == CV_32S || depth == CV_32F) in function approxPolyDP

あなたは最後に私の完全なコードを見つけることができ、ここで私はトラブルを作っていると思うのコードですちょうど私が置いた多くのifループ?私は良いプログラマーではないので、時にはサンプルをオンラインで取り込み、自分のコードで一緒にアセンブルし、真のプログラマーには本当の意味をなさないコードを自分で追加します。そのすべてが最終的にこのようなエラーにつながります私は推測する。とにかく、何かヒント/助けてくれてありがとう!この場合に役立ちます

は、ここに私の完全なコードです:

#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 

using namespace cv; 
using namespace std; 

Mat src; 
Mat src_gray; 
Mat dst(src.rows,src.cols,CV_8UC1,Scalar::all(0)); 
Mat transformed; 

int thresh = 100; 
int max_thresh = 255; 
RNG rng(12345); 

///function main /// 
int main(int argc, char** argv) 
    { 
    int largest_area=0; 
    int largest_contour_index=0; 

    VideoCapture cap("test1.mp4"); 
    if (!cap.isOpened()) //exit the main if not successful 
     { 
     cout << "Cannot open the web cam" << endl; 
     return -1; 
     } 
    while (true) 
     { 
      bool bSuccess = cap.read(src); // read a new frame from video 

      if (!bSuccess) //if not success, break loop 
       { 
       cout << "Cannot read a frame from video stream" << endl; 
        break; 
       } 

     cvtColor(src, src_gray, CV_BGR2GRAY); 
     blur(src_gray, src_gray, Size(3,3)); 

     char* source_window = "Source"; 
     namedWindow(source_window, CV_WINDOW_AUTOSIZE); 
     imshow(source_window, src); 

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

// Detect edges using Threshold 
     threshold(src_gray, threshold_output, 190, 255, THRESH_BINARY); 
// Find contours 
     findContours(threshold_output, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 

// Approximate contours to polygons + get bounding rects 
     vector<vector<Point> > contours_poly(contours.size()); 
     vector<Rect> boundRect(contours.size()); 
     vector<Point2f>center(contours.size()); 
     vector<float>radius(contours.size()); 

// Draw polygonal contour + bonding rects around the object 
     Rect bounding_rect; 
     Mat drawing = Mat::zeros(threshold_output.size(), CV_8UC3); 
     for(int i = 0; i< contours.size(); i++) 
      { 
// Find the largest area of contour, and the bounding rect for the largest contour 
      double a=contourArea(contours[i],false); 
      if(a>largest_area) 
       { 
       largest_area=a;cout<<i<<" area "<<a<<endl; 
       largest_contour_index=i;    
       bounding_rect=boundingRect(contours[i]); 
       } 
      Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255)); 
//drawContours(drawing, contours_poly, i, color, 1, 8, vector<Vec4i>(), 0, Point()); 
      rectangle(drawing, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0); 
      drawContours(src, contours_poly, i, color, 1, 8, vector<Vec4i>(), 0, Point()); 

      } 
     approxPolyDP(Mat(contours[largest_contour_index]), contours_poly[0],20, true); 
     if(contours_poly[0].size()==4) 
      { 
      std::vector<Point2f> quad_pts; 
      std::vector<Point2f> squre_pts; 

      for (int j = 0; j < 4 ; j++) 
       { 
       if (contours_poly[0][j].x <= 900 && contours_poly[0][j].y <= 500) 
        { 
        quad_pts.push_back(Point2f(contours_poly[0][j].x,contours_poly[0][j].y)); 
        continue; 
        } 
       continue; 
       } 

      for (int k = 0; k < 4 ; k++) 
       { 
       if (contours_poly[0][k].x <= 900 && contours_poly[0][k].y >= 500) 
        { 
        quad_pts.push_back(Point2f(contours_poly[0][k].x,contours_poly[0][k].y)); 
        continue; 
        } 
       continue; 
       } 

      for (int l = 0; l < 4 ; l++) 
       { 
       if (contours_poly[0][l].x >= 900 && contours_poly[0][l].y <= 500) 
        { 
        quad_pts.push_back(Point2f(contours_poly[0][l].x,contours_poly[0][l].y)); 
        continue; 
        } 
       continue; 
       } 

      for (int m = 0; m < 4 ; m++) 
       { 
       if (contours_poly[0][m].x >= 900 && contours_poly[0][m].y >= 500) 
        { 
        quad_pts.push_back(Point2f(contours_poly[0][m].x,contours_poly[0][m].y)); 
        continue; 
        } 
       continue; 
       } 

      squre_pts.push_back(Point2f(bounding_rect.x,bounding_rect.y)); 
      squre_pts.push_back(Point2f(bounding_rect.x,bounding_rect.y+bounding_rect.height)); 
      squre_pts.push_back(Point2f(bounding_rect.x+bounding_rect.width,bounding_rect.y)); 
      squre_pts.push_back(Point2f(bounding_rect.x+bounding_rect.width,bounding_rect.y+bounding_rect.height)); 

      Mat transmtx = getPerspectiveTransform(quad_pts,squre_pts); 
      cout << "quad =" << quad_pts << " squre =" << squre_pts << endl; 
      imwrite("perspecTrans.jpg",transmtx); 
      transformed = Mat::zeros(src.rows, src.cols, CV_8UC3); 
      warpPerspective(src, transformed, transmtx, src.size()); 
      Point P1=contours_poly[0][0]; 
      Point P2=contours_poly[0][1]; 
      Point P3=contours_poly[0][2]; 
      Point P4=contours_poly[0][3]; 

      line(src,P1,P2, Scalar(0,0,255),1,CV_AA,0); 
      line(src,P2,P3, Scalar(0,0,255),1,CV_AA,0); 
      line(src,P3,P4, Scalar(0,0,255),1,CV_AA,0); 
      line(src,P4,P1, Scalar(0,0,255),1,CV_AA,0); 
      rectangle(src,bounding_rect,Scalar(255,255,0),1,8,0); 
      rectangle(transformed,bounding_rect,Scalar(0,255,255),1,8,0); 

      namedWindow("1",CV_WINDOW_AUTOSIZE); 
      imshow("1", transformed); 

      imwrite("result1.jpg",dst); 
      imwrite("result2.jpg",src); 
      imwrite("result3.jpg",transformed); 
      waitKey(); 
      } 
      else 
      cout<<"Pb with the 4 corners using approxPolyDP?"<<endl; 

     Mat ROI=transformed(bounding_rect); //Set ROI on source image 
     imwrite("cropped.jpg",ROI); //save ROI image 
     namedWindow("Contours", CV_WINDOW_AUTOSIZE); 
     imshow("Contours", src); 
     waitKey(0); 
     destroyAllWindows(); 
     } 
    return(0); 
} 

答えて

0

問題が解決:私はちょうど前に0 largest_areaに再初期化するために必要なforループ。私はこれが誰の助けになるとは思わないが、私はこれをちょうどの場合に書いている。

関連する問題