簡體   English   中英

OpenCV:調試斷言失敗(pHead->nBlockUse)

[英]OpenCV: Debug Assertion Fail (pHead->nBlockUse)

我的程序正在從網絡攝像頭獲取輸入並實時輸出高斯金字塔。 程序運行良好,但是當我退出時(通過按一個鍵觸發 waitKey()),我收到一個錯誤:

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

我懷疑這與我用來創建高斯金字塔的buildPyramid()函數有關。 輸出需要一個 Mat 數組。 輸出的墊子數量取決於層數,因此輸出需要是一個指針。 我不知道問題是初始化變量還是最后沒有被刪除。 我也可能完全不關心這個原因。

我正在用這個制作數組數組:

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

所以,這里有兩件事不對。

a) 你不能使用 opencv 過時的 c-api,混合 c 和 c++ 調用是直奔地獄的道路。

b) c++ 從 0 開始索引,最后一個有效索引是 size-1,所以對於 4 個級別,levels[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;
}

暫無
暫無

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

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