2016-03-21 46 views
0

Konturları bulmak için aşağıdaki kodun çalışma zamanı sırasında segmentasyon hatası hatası alıyorum. Bu formda this gönderim var ama bana fazla yardımcı olmadı. Bilmem gereken bazı sorunlar var findContours Bu, findContours başka bir konudur. Lütfen her iki bağlantıyı da kontrol edin ve bu hatayı gidermek için bana yardımcı olun. Neden segmentasyon hatası hatası alıyorum bilmiyorum.segmentasyon hatası

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

Hata: Ben OpenCV bilmiyorum ama ... Ben senin contour vektör findContours() ile beslerler varsayalım

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) 
+1

gdb'yi kullanarak hata ayıklamaya çalışmalı ve hangi satırın bölümlendirme hatası verdiğini bulmalısınız, daha sonra bunu daha kolay bir şekilde düzeltebilirsiniz. Bunun nedeni, contours_poly [i] indekslenmediğinden kaynaklanıyor olsa da (boş) – Wajahat

+0

@Wajahat GDB hata ayıklaması yaptım ve sonucun altında kaldım. Program sinyali SIGSEGV, Segmentation hatası aldı. 0xb7b4534b içinde cv :: _ OutputArray :: create (int, int const *, int, int, bool, int) const()/usr/local/lib/libopencv_core.so.3.1 ' – pradeep

cevap

1

. Ben, istruction yanlış değilsem

Yani,

vector<vector<Point> > contours; 

sıfır unsurların bir vektör oluşturur; Aşağıdaki istructions

vector<vector<Point> > contours_poly(contours.size()); 
vector<Rect> boundRect(contours.size()); 
vector<Point2f>center(contours.size()); 
vector<float>radius(contours.size()); 

elemanları sıfır ( contours.size() sıfırdır) 'in diğer vektörleri yaratmak.

Sonra findContours() ve contours değiştirme boyutu denir.

şu istruction

contours.resize(contours.size()); 

unuseful ama sıfır boyut vektörü ilk elemanı erişmeye çalıştığınızda asıl sorun (contours_poly)

Öneri burada

approxPolyDP(Mat(contours[i]), contours_poly[i], 3, true); 

başlamak : findContours()

numaralı çağrıdan sonra diğer vektörleri bildirme (veya yeniden boyutlandırma)

p.s .: kötüm için üzgünüm

+0

Çok teşekkür ederim. Bana yardımcı oldu. – pradeep

+0

@predeep: hiç de değil. – max66