findContours возвращает утверждение не удалось

0

Кажется, что функция findContours возвращала какое-то утверждение с помощью Visual Studios C++ 2012. Я убедился, что все мои каталоги включений в порядке.

void track (Mat input_video, Mat &output_video)
    {
    Mat temp;
    input_video.copyTo(temp);
    vector<vector<cv::Point> > contours;
    vector<Vec4i> hierarchy;
    findContours(temp, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);

    //Only search through the most external layer.
    for (int i=0; i>=0; i=hierarchy[i][0])
    {

        Moments moment = moments((Mat) contours[i]);
        double area= moment.m00;
        double xmc= moment.m10;
        double ymc= moment.m01;
        double x= xmc/area;
        double y= ymc/area;
        circle(output_video, Point(x,y), 3, Scalar(0,255,255));
    }
}

РЕДАКТИРОВАТЬ:

Остальная часть моего кода, если вам это может понадобиться:

#include "opencv2/opencv.hpp"
#include <iostream>

using namespace std;
using namespace cv;
//This function threshold the HSV image and create a binary image
Mat GetThresholdedImage(Mat imgHSV, int huemin, int satmin, int valmin, int huemax, int satmax, int valmax)
{
    //Size s= imgHSV->size();
    Mat imgThresh(imgHSV.size().height, imgHSV.size().width, CV_8U);
    //returns matrix that contains all values within the given HSV range.
    inRange(imgHSV, Scalar(huemin,satmin,valmin), Scalar(huemax,satmax,valmax), imgThresh); 
       return imgThresh;
}

Mat morph(Mat imgThresh)
{
    Mat erode_element= getStructuringElement(MORPH_RECT, Size(3,3));
    Mat dilate_element= getStructuringElement(MORPH_RECT, Size(8,8));

    erode(imgThresh, imgThresh, erode_element);
    erode(imgThresh, imgThresh, erode_element);
    dilate(imgThresh, imgThresh, dilate_element);

    return imgThresh;
}

void track (Mat input_video, Mat &output_video)
{
    Mat temp;
    input_video.copyTo(temp);
    vector< vector<Point> > contours;
    cerr<< contours.size();
    vector<Vec4i> hierarchy;
    findContours(temp, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
    cerr<<contours.size();
    //Only search through the most external layer.
    for (int i=0; i>=0; i=hierarchy[i][0])
    {

        Moments moment = moments((Mat) contours[i]);
        double area= moment.m00;
        double xmc= moment.m10;
        double ymc= moment.m01;
        double x= xmc/area;
        double y= ymc/area;
        circle(output_video, Point(x,y), 3, Scalar(0,255,255));
    }
}


int main()
{
    VideoCapture capture(0);
    if(!capture.isOpened()){
        cerr<< "Capture failed";
        return -1;
      }

    Mat frame;
    namedWindow("Original");      
    namedWindow("Binary");
    //Create slider for adjustments...
    namedWindow("Adjustments");
    int huemin= 0, satmin= 0, valmin= 0;
    int huemax= 256, satmax= 256, valmax= 256;
    createTrackbar("Min Hue", "Adjustments", &huemin, 256);
    createTrackbar("Max Hue", "Adjustments", &huemax, 256);
    createTrackbar("Min Saturation", "Adjustments", &satmin, 256);
    createTrackbar("Max Saturation", "Adjustments", &satmax, 256);
    createTrackbar("Min Value", "Adjustments", &valmin, 256);
    createTrackbar("Max Value", "Adjustments", &valmax, 256);
      //iterate through each frames of the video      
    while(true)
    {
        //Grabs each frame from video to be processed.
        capture>> frame;
        //Error checks and breaks if the grab failed.
        if(!frame.data)
            {
                cerr<< "Failed to grab frame\n";
                break;
            }

        //Apply a Gaussian Blur kernel.
        //GaussianBlur(frame, frame, Size(3,3), 3, 3, 4);
        Mat imgHSV(frame.size(), CV_8UC3);
        cvtColor(frame, imgHSV, CV_BGR2HSV, 0); //Change the color format from BGR to HSV
        Mat imgThresh = GetThresholdedImage(imgHSV, huemin, satmin, valmin, huemax, satmax, valmax);
        //GaussianBlur(imgThresh, imgThresh, Size(5,5), 3, 3, 4); //smooth the binary image using Gaussian kernel
        imgThresh= morph(imgThresh);
        track(imgThresh, frame);
        imshow("Binary", imgThresh);  
        imshow("Original", frame);

        int key = waitKey(30);
        //If 'ESC' is pressed, break the loop
        if(key==27 ) break;      
      }

    destroyAllWindows();
      //cvReleaseCapture(&capture);     

      return 0;
}
  • 2
    пожалуйста, точное утверждение, которое не удалось ..
  • 0
    @Eugene Евгений Лаксана Прежде чем получить доступ к контуру, просто проверьте, есть ли контур с помощью contours.size () ...
Показать ещё 8 комментариев
Теги:
opencv
assertion

1 ответ

0

Евгений, я столкнулся с той же проблемой. попробуйте добавить "cv :: imshow (" im ", output_video); как указано в - OpenCV findContours вызывает отказ от ответа на отладку при возврате

Ещё вопросы

Сообщество Overcoder
Наверх
Меню