C++ & OpenCV 断言失败

Posted

技术标签:

【中文标题】C++ & OpenCV 断言失败【英文标题】:C++ & OpenCV assertion failed 【发布时间】:2015-01-16 12:17:32 【问题描述】:

我正在开发需要在 opencv 中使用以下 MATLAB 代码开关的应用程序。 这是我在 MATLAB 中的代码:

HSV = imread(k);
S=size(HSV)
x = zeros(3,S(1)*S(2));
k=1;
for i = 1:S(1)
  for j = 1:S(2)
    x(1,k)=i;
    x(2,k)=j; 
    x(3,k)=HSV(i,j,1); %H
    x(4,k)=HSV(i,j,2); %S 
    k=k+1;
  end
end

这是我在 OpenCV 中的代码,但我认为它是错误的:

IplImage* img;
img = cvLoadImage("---");

CvMat* x = cvCreateMat(4, img->width*img->height, CV_8UC3);
int k = 1;
for (int h = 1; h <= img->height; h++)
 
  for (int w = 1; w <= img->width; w++)
  
    CV_MAT_ELEM(*x, int, 1, k) = h; 
    CV_MAT_ELEM(*x, int, 2, k) = w;
    CV_MAT_ELEM(*x, int, 3, k) = CV_IMAGE_ELEM(img, uchar, h, 3 * w); //H
    CV_MAT_ELEM(*x, int, 4, k) = CV_IMAGE_ELEM(img, uchar, h, 3 * w + 1); //S 
    k = k + 1;
  

我收到这样的错误:断言失败:(unsigned)(4)

【问题讨论】:

【参考方案1】:

Matlab 有基于 1 的索引,而 C 有基于 0 的索引 - 所有 for 循环和左侧 CV_MAT_ELEM 上的 1-4 都需要从 0 变为 length-1。

【讨论】:

感谢您的回复。我纠正了错误,但现在我得到了这个异常:openCV.exe 中 0x010A6ADD 的第一次机会异常:0xC0000005:访问冲突写入位置 0x01082000。 openCV.exe 中 0x010A6ADD 处未处理的异常:0xC0000005:访问冲突写入位置 0x01082000。 您是否将 int k = 1 修复为 int k = 0?使用调试器或打印语句,您可以找到访问冲突之前 h、w 和 k 的值,将它们与宽度和高度进行比较。 是的,并且 CV_MAT_ELEMs 中的 int 切换到 uchar。现在一切正常。非常感谢。

以上是关于C++ & OpenCV 断言失败的主要内容,如果未能解决你的问题,请参考以下文章

使用 Opencv 时 C++ 调试断言失败

cvtColor 断言失败(使用 C++ 的 OpenCV)抛出实例 cv::exception

OpenCV 断言失败:(-215:断言失败)npoints >= 0 &&(深度 == CV_32F || 深度 == CV_32S)

调试断言失败表达式:_pFirstBlock == pHead 使用 OpenCV 和 C++ 尝试调用 SurfFeatureDetector

OpenCV HOG+SVM:断言失败 checkDetectorSize()

OpenCV:arcLength 断言失败并出现 cv::Mat