2014-03-30 1 views
-1

내 프로그램이 웹캠에서 입력을 받고 실시간으로 가우시안 피라미드를 출력하고 있습니다. 이 프로그램은 잘 실행,하지만 난합니다 (waitKey()을 트리거 키를 누름) 종료 할 때, 나는 오류 얻을 :이 내가 가우스를 만드는 데 사용하고있는 buildPyramid() 기능과 관련된 것으로 의심되는OpenCV : 디버그 어설 션 오류 (pHead-> nBlockUse)

Debug Assertion Failed! 
_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)) 
Line 52: dbgdel.cpp 

을 피라미드. 출력물에는 매트 배열이 필요합니다. 출력되는 매트의 수는 레벨 수에 따라 다르므로 출력은 포인터 여야합니다. 나는 문제가 변수를 초기화하는 것과 관련이 있는지, 아니면 결국 삭제되지 않는지는 모른다. 나는 또한 그 원인에 대해 완전히 벗어날 수 있습니다.

std::vector<cv::Mat> GPyr; 

을하고 나는이와 가우시안 피라미드를 만드는 중이라서 :

나는이 함께 배열의 배열을 만드는 중이라서 오류의 원인이 무엇인지에 대한

buildPyramid(imgMatNew, GPyr, levels, BORDER_DEFAULT); 

어떤 아이디어?

전체 소스 :

#include "stdafx.h" 
#include <iostream> 
#include <stdio.h> 

#include "opencv2/core/core.hpp" 
#include "opencv2/flann/miniflann.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/photo/photo.hpp" 
#include "opencv2/video/video.hpp" 
#include "opencv2/features2d/features2d.hpp" 
#include "opencv2/objdetect/objdetect.hpp" 
#include "opencv2/calib3d/calib3d.hpp" 
#include "opencv2/ml/ml.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/contrib/contrib.hpp" 
#include "opencv2/core/core_c.h" 
#include "opencv2/highgui/highgui_c.h" 
#include "opencv2/imgproc/imgproc_c.h" 
#include "opencv2\objdetect\objdetect.hpp" 

using namespace cv; 
using namespace std; 

int main() 
{ 

    CvCapture* capture = 0; 

    // imgMatNew, imgMatOut were used to grab the current frame 
    Mat frame, frameCopy, image, imgMatNew, imgMatOut; 
    std::vector<cv::Mat> GPyr; 

    int levels = 4; 

    capture = cvCaptureFromCAM(CV_CAP_ANY); //0=default, -1=any camera, 1..99=your camera 
    if (!capture) 
    { 
     cout << "No camera detected" << endl; 
    } 

    //cvNamedWindow("result", CV_WINDOW_AUTOSIZE); 
    namedWindow("GPyrOut", WINDOW_AUTOSIZE); 
    namedWindow("imageNew", WINDOW_AUTOSIZE); 

    if (capture) 
    { 
     cout << "In capture ..." << endl; 
     for (;;) 
     { 
      // capture frame from video camera 
      IplImage* iplImg = cvQueryFrame(capture); 
      frame = iplImg; 

      // convert ilpImg into Mat format for easy processing 
      imgMatNew = cvarrToMat(iplImg, 1); 


      // Start Image Processing Here 
      buildPyramid(imgMatNew, GPyr, levels, BORDER_DEFAULT); 

      // Show Window 
      imshow("GPyrOut", GPyr[levels]); //show G Pyr, at a certain level, mex index = levels 
      imshow("imageNew", imgMatNew); //show window 

      if (waitKey(10) >= 0) 
       break; 
     } 
     // waitKey(0); 
    } 

    cvReleaseCapture(&capture); 

    return 0; 
} 

답변

0

그렇게 잘못 여기에 2 가지가있다.

a) 아니요 opencv의 오래된 c-api를 사용하여 c 및 C++ 호출을 혼합하는 것이 지옥의 직선 도로입니다.

b) C++은 0에서 인덱싱을 시작하고 마지막 유효 인덱스는 크기 -1이므로 4 레벨의 경우 레벨 [4]가 범위를 벗어납니다. 이 경우 적절한 예외를 얻기 위해 디버그 빌드를 실행하십시오!

Mat frame, frameCopy, image, imgMatNew, imgMatOut; 
std::vector<cv::Mat> GPyr; 

int levels = 4; 

VideoCapture capture(0); 

if (!capture.isOpened()) 
{ 
    cout << "No camera detected" << endl; 
    return -1; 
} 

//cvNamedWindow("result", CV_WINDOW_AUTOSIZE); 
namedWindow("GPyrOut", WINDOW_AUTOSIZE); 
namedWindow("imageNew", WINDOW_AUTOSIZE); 

cout << "In capture ..." << endl; 
for (;;) 
{ 
    // capture frame from video camera 
    capture.read(frame); 

    // Start Image Processing Here 
    buildPyramid(frame, GPyr, levels, BORDER_DEFAULT); 

    // Show Window 
    imshow("GPyrOut", GPyr[levels-1]); //show last level 
    imshow("imageNew", frame); //show window 

    if (waitKey(10) >= 0) 
     break; 
} 
: 여기

는 수정 된 코드입니다