Я получаю ошибку ошибки сегментации во время выполнения кода ниже, чтобы найти контуры. Я сослался этот разместить в этой форме, но мне не очень помогло. Я узнал, что есть некоторые проблемы с findContours Это еще одна проблема findContours. Пожалуйста, проверьте обе ссылки и помогите мне решить эту ошибку. Я не знаю, почему я получаю ошибку ошибки сегментации.
#include "opencv2/objdetect/objdetect.hpp"#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace cv;
string window_name = "Captured rectangle block";
RNG rng(12345);
double fps;
int thresh = 100;
int main( int argc, const char** argv )
{
VideoCapture cap("video.mp4"); // open the video file for reading
if ( !cap.isOpened() ) // if not success, exit program
{
cout << "Cannot open the video file" << endl;
return -1;
}
fps = cap.get(CV_CAP_PROP_FPS); //get the frames per seconds of the video
cout << "Frame per seconds : " << fps << endl;
double dWidth = cap.get(CV_CAP_PROP_FRAME_WIDTH);
double dHeight = cap.get(CV_CAP_PROP_FRAME_HEIGHT);
Size S(dWidth,dHeight);
while(1)
{
Mat frame;
Mat threshold_output;
int skip_frame = 4;
while(skip_frame)
{
printf("inside while loop\n");
bool bSuccess = cap.read(frame); // read a new frame from video
skip_frame--;
if (!bSuccess) //if not success, break loop
{
cout << "Cannot read the frame from video file" << endl;
break;
}
}
//-- 3. Apply the classifier to the frame
if( frame.empty() )
{ printf(" --(!) No captured frame -- Break!"); break; }
std::vector<Rect> faces;
Mat frame_gray;
cvtColor( frame, frame_gray, CV_BGR2GRAY );
equalizeHist( frame_gray, frame_gray);
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
vector<vector<Point> > contours_poly( contours.size() );
vector<Rect> boundRect( contours.size() );
vector<Point2f>center( contours.size() );
vector<float>radius( contours.size() );
printf("before finding countrs\n");
threshold( frame_gray, threshold_output, thresh, 255, THRESH_BINARY );
findContours( threshold_output, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
contours.resize(contours.size());
printf("after finding countrs\n");
for( unsigned int i = 0; i < contours.size(); i++ )
{
printf("inside for loop\n");
approxPolyDP( Mat(contours[i]), contours_poly[i], 3, true );
printf("after poly\n");
boundRect[i] = boundingRect( Mat(contours_poly[i]) );
printf("after bondrec\n");
minEnclosingCircle( (Mat)contours_poly[i], center[i], radius[i] );
}
Mat drawing = Mat::zeros( threshold_output.size(), CV_8UC3 );
for( unsigned int i = 0; i< contours.size(); 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 );
circle( drawing, center[i], (int)radius[i], color, 2, 8, 0 );
}
/// Show in a window
namedWindow( "Contours", CV_WINDOW_AUTOSIZE );
imshow( "Contours", drawing );
int c = waitKey(10);
if( (char)c == 'c' ) { break; }
}
return 0;
}
Ошибка:
Frame per seconds : 15
inside while loop
inside while loop
inside while loop
inside while loop
before finding countrs
after finding countrs
inside for loop
Segmentation fault (core dumped)
Я не знаю openCv, но … я полагаю, что ваш contour
вектор подается findContours()
,
Так что, если я не ошибаюсь, то иструкция
vector<vector<Point> > contours;
создает вектор из нулевых элементов; следующие иструкции
vector<vector<Point> > contours_poly( contours.size() );
vector<Rect> boundRect( contours.size() );
vector<Point2f>center( contours.size() );
vector<float>radius( contours.size() );
создать другие векторы нулевых элементов (contours.size()
это ноль).
затем findContours()
называется и contours
изменить размер.
Следующая иструкция бесполезна
contours.resize(contours.size());
но настоящая проблема начинается здесь
approxPolyDP( Mat(contours[i]), contours_poly[i], 3, true );
при попытке получить доступ к первому элементу вектора нулевого размера (contours_poly
)
Предложение: объявите (или измените размер) другие векторы после вызова findContours()
p.s .: извините за мой плохой английский
Других решений пока нет …