从函数崩溃返回,仅在代码中的某个点之后

时间:2015-09-02 09:15:18

标签: c++ function opencv crash return

我无法弄清楚当我从程序返回时我的函数崩溃的原因。我做了一些调试,并喜欢从函数返回导致它崩溃的那一刻。

void Find_contour()
{
//VAR
double threshold_val = 128;
int n_erode_dilate = 1;
Mat m = img_complete.clone();

cvtColor(m, m, CV_RGB2GRAY);
blur(m, m, Size(5, 5));
threshold(m, m, threshold_val, 255, CV_THRESH_BINARY);
erode(m, m, Mat(), Point(-1, -1), n_erode_dilate);
dilate(m, m, Mat(), Point(-1, -1), n_erode_dilate);

vector<vector<Point> > contours;
vector<Point> points;

    //returning here is safe******

findContours(m, contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);

    //returning after here crashes******

for (size_t i = 0; i<contours.size(); i++) {
    for (size_t j = 0; j < contours[i].size(); j++) {
        Point p = contours[i][j];
        points.push_back(p);
    }
}


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

for (int i = 0; i < contours.size(); i++)
{
    approxPolyDP(Mat(contours[i]), contours_poly[i], 3, true);
    boundRect[i] = boundingRect(Mat(contours_poly[i]));
}

//drawContours(img_contour, contour, idx, colors[idx % 4]);

for (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, i, color, 2, 8, CV_RETR_LIST, 0, Point());
    rectangle(drawing, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0);
}

}

这是函数,我已经标记了返回的安全位置以及崩溃的位置,所以我假设它与我的向量有关。

我可能只是遗漏了一些基本的东西,这让我很难抬头,提前谢谢!

编辑:嘿我把它缩小了findContours。单步执行代码,在安全位置返回会将我带到inline void Mat::release(函数,而findContours之后的任何地方都会将我注释为// TEMPLATE FUNCTION _Destroy_range。然后转到void deallocate,在此点导致我的程序中断。并有一条消息。

图像检测中的0x51995042(ucrtbase.dll)处理未处理的异常2.exe:将无效参数传递给认为无效参数致命的函数。

我还想补充一点,只有当函数返回或结束时才会出现此错误,findContour期间没有错误。

我对整个过程相当陌生,非常感谢每个人的帮助。

1 个答案:

答案 0 :(得分:2)

事实证明,OpenCV 3.0.0和Visual Studio 2015存在一些兼容性问题。

我已经尝试使用Visual Studio 2013,一切都运行良好。

感谢那些帮助过的人,并感谢@Simon Kraemer提出的建议。