簡體   English   中英

OPENCV / C ++:roximateddp斷言失敗錯誤

[英]OPENCV / C++ : approxpolydp assertion failed error

我目前正在為學生和記者開展嵌入式視覺項目,但遇到了麻煩。 我剛收到一個錯誤消息:

OpenCV錯誤:大約PolyDP,文件/home/linuxu/OpenCV/modules/imgproc/src/approx.cpp中的斷言失敗(npoints> = 0 &&(深度== CV_32S ||深度== CV_32F)),在調用之后終止拋出'cv :: Exception'what()的實例what():/home/linuxu/OpenCV/modules/imgproc/src/approx.cpp:679:錯誤:(-215)npoints> = 0 &&(depth == CV_32S | | depth == CV_32F)在函數roxPolyDP中

您會在結尾找到完整的代碼,這是我認為麻煩的代碼:

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循環? 因為我不是一個優秀的程序員,所以有時我會在線收集示例並將其組裝到我的代碼中,然后自己添加一個對任何真正的程序員都沒有意義的書面代碼,所有這些最終都會導致類似這樣的錯誤我猜。 無論如何,謝謝您的提示/幫助!

如果有幫助,這是我的完整代碼:

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

解決的問題:我只需要在for循環之前重新初始化為0 maximum_area。 我認為這不會幫助任何人,但是我寫這個只是為了以防萬一。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM