【问题标题】:Assertion failed ROI opencv断言失败 ROI opencv
【发布时间】:2014-11-24 02:51:41
【问题描述】:

我使用带有 opencv 3.0 的 Visual Studio 2012。 我已经检查了几篇关于这个问题的帖子,但是当我运行这段代码时,我仍然收到断言失败错误 -215:

IplImage * imageOriginal = cvLoadImage("road1.jpg");

int width = 0, height = 0;    
width = imageOriginal->width;
height = imageOriginal->height;
IplImage* img = cvCreateImage(cvGetSize(imageOriginal), imageOriginal->depth , 3);    

CvRect cropRect = cvRect(0, 0, width -10, height -10 ); // ROI in source image 

cvSetImageROI(imageOriginal, cropRect);

try {
  cvCopy(imageOriginal, img, NULL); // Copies only crop region
}
catch (cv::Exception& e) {
  cout << e.what() << endl;
}
cvResetImageROI(imageOriginal);
cvShowImage( "Original ROI", img);
waitKey();

如果我将矩形保留为全尺寸CvRect cropRect = cvRect(0, 0, width, height);,我不会出错。有什么问题?

【问题讨论】:

  • 你确定你的宽高不小于10,如果是,那么裁剪区域的有效高和宽会小于等于0,这可能就是你看到的原因断言失败。
  • 您是否在所有负载/创建中检查了 nullptr?如果宽度为 0,则在当前代码中得到 -10。
  • 一般来说,为什么不使用 cvRect,改变第三个和第四个参数,看看什么时候会出错。删除所有其他代码。试试 cvRect(0, 0, 100, 100);然后 cvRect(0, 0, 200, 200);以此类推
  • 如果我输入一个小于图像大小 (648x482) 的整数,我仍然会收到错误,并且我肯定会加载图像,没有 NULL 指针扩展。
  • 我不确定,将内存分配给原始大小的图像并仅复制裁剪部分是否不正确?为什么不转换为新的Mat

标签: c++ opencv assertion roi


【解决方案1】:

您的代码来自 opencv1.0。 (那是很久以前的事了)

对于 opencv3.0,请改用 c++ api:

#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
using namespace cv;

int main() {
    Mat img = imread("road1.jpg");
    Mat roi = img(Rect(0,0,img.cols-10,img.rows-10));
    imshow("hi",roi);
    return waitKey();
}

【讨论】:

  • 我必须使用 Iplimage 作为数据结构,因为它将在其他地方使用此代码。
  • 不能。 (不会有讨论)
  • 好的,更准确地说:我必须为 RTMaps 制作一个模块,其中仅使用 Iplimage 软件工具。所以,我必须使用 Iplimage 来保持我的代码干净并在 RTMaps 中使用。对不起,如果我伤害了你的感情@berak。无论如何,感谢您的帮助,但我不能。
  • 看,整个事情都让你感到困惑,你必须预先分配 img(而且你把它弄得太大了)
  • 即使你必须使用遗留代码,也尽量不要添加技术债务。
猜你喜欢
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
  • 2014-02-10
  • 2012-11-26
  • 2014-05-28
  • 2020-12-31
  • 2015-09-12
  • 2015-04-25
相关资源
最近更新 更多