“ Project.exe已触发断点。”

时间:2018-07-26 06:51:49

标签: c++ visual-studio opencv memory-management

我正在Visual Studio上使用C ++和OpenCV;对于我的应用程序,我有一组图像和一个.mask图像,可以在每个图像中选择一个ROI(除ROI外,其他任何地方均为0)。

我通过以下方式加载图像(duck1.jpgduck2.jpg等)

std::array<cv::Mat, n_imgs> img;
std::string folder = "C:/Users/imgs/";
std::string fname = "duck";
std::string format = ".jpg";

for (int i = 0; i < n_imgs; i++)
    img[i] = cv::imread(folder + fname + std::to_string(i + 1) + format, 0);

然后,我戴上口罩:

cv::Mat mask = cv::imread(folder + fname + ".mask" + format, 0);

for (int i = 0; i < img[0].rows; i++)
    for (int j = 0; j < img[0].cols; j++)
        for (int k = 0; k < n_imgs; k++)
            if (mask.at<float>(i, j) == 0)
                img[k].at<float>(i, j) = 0.f;

我不断收到“ Project.exe触发了断点”。在我的后续代码的某些重复点中是相当随机的(由于篇幅太长,我不会在这里发布);但是,当我评论掩蔽线时,这些问题就消失了。

鉴于症状,我认为这是分配问题,对吗?我该如何解决?

2 个答案:

答案 0 :(得分:1)

更多的是猜测是什么问题,但我会给您一个提示。

您确定img具有浮点数作为基础类型吗?因为当您执行cv::imread(file, IMREAD_GRAYSCALE )时,此0代表灰度图像,当您使用浮点数(大小为32位)寻址它时,通常是CV_8UC1(8位无符号字符),可能会在结束后写出内存(写入图像中最后一个像素之后的24位)。这有时可能会触发错误,有时却不会触发错误,这取决于图像之后内存中的内容(是否分配)。我想如果您在Debug模式下运行程序,它将始终失败。

所以改变:

for (int i = 0; i < img[0].rows; i++)
    for (int j = 0; j < img[0].cols; j++)
        for (int k = 0; k < n_imgs; k++)
            if (mask.at<float>(i, j) == 0)
                img[k].at<float>(i, j) = 0.f;

收件人:

for (int i = 0; i < img[0].rows; i++)
    for (int j = 0; j < img[0].cols; j++)
        for (int k = 0; k < n_imgs; k++)
            if (mask.at<unsigned char>(i, j) == 0)
                img[k].at<unsigned char>(i, j) = 0;

如果您希望代码运行得更快,并且具有二进制掩码(值为0和1),则可以像这样将这些元素逐个相乘(请注意,这仅适用于一张图像):

cv::Mat afterApplyMask = img.mul(mask);

答案 1 :(得分:-1)

遇到此错误时,我正在Visual Studio中编写C代码。我的项目名称和源文件中解决方案的名称相同。更改并调试后,我不再遇到错误。