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