2016-10-18 4 views
0

Ich arbeite derzeit an einem Embedded Vision-Projekt für Studenten & Journalisten, aber ich habe Probleme. Ich habe einen Fehler sagte:OPENCV/C++: approximatepolydp Assertion gescheitert Fehler

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

Sie werden meinen vollen Code am Ende finden, hier ist der Code, den ich denke, machen Probleme:

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); 

Oder vielleicht ist es wegen der die vielen if-Loops, die ich gleich hinter mich setze? Da ich kein guter Programmierer bin, nehme ich manchmal online Samples und setze sie in meinem Code zusammen und füge einen eigenen Code hinzu, der für einen echten Programmierer keinen Sinn ergibt, und all das führt schließlich zu Fehlern wie diesem Ich vermute. Wie auch immer, danke für irgendwelche Tipps/Hilfe!

Hier ist mein vollständiger Code, ob das hilft:

#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); 
} 

Antwort

0

Problem gelöst: Ich muß nur auf 0 largest_area initialisieren erneut vor dem for-Schleife. Ich denke nicht, dass das irgendjemandem helfen wird, aber ich schreibe das nur für den Fall.

Verwandte Themen