OpenCV:为什么我在原始 Mat 上断言失败,而在克隆的 Mat 上却没有?

问题描述

我正在尝试将 Sobel 过滤器应用到我的垫子上,该垫子具有来自外部来源的数据。简化后的代码如下所示:

// Create Mats
cv::Mat src = cv::Mat( cv::Size( ACQ_WIDTH,ACQ_HEIGHT ),CV_8U );
cv::Mat dx;

// Point Mat to buffer data
src.data = (uchar*)(bufObject->address);

// Calculate x-gradient
cv::Sobel( src,dx,CV_16U,1,CV_SCHARR,BORDER_REPLICATE ) ;

但是当我应用它时,它给出了一个 ROI 断言错误

OpenCV Error: Assertion Failed (roi.x >= 0 && roi.y >= 0 && roi.width >= 0 && roi.height >= 0 && roi.x + roi.width <= wholeSize.width && roi.y + roi.height <= wholeSize.height) in start,file /home/nvidia/Desktop/opencv-3.3.1/modules/imgproc/src/filter.cpp,line 173
terminate called after throwing an instance of 'cv::Exception'
  what():  /home/nvidia/Desktop/opencv-3.3.1/modules/imgproc/src/filter.cpp:173: error: (-215) roi.x >= 0 && roi.y >= 0 && roi.width >= 0 && roi.height >= 0 && roi.x + roi.width <= wholeSize.width && roi.y + roi.height <= wholeSize.height in function start

非常奇怪(至少在我看来),当我克隆相同的矩阵并将过滤器应用于克隆时,一切都很好

// Create Mats
cv::Mat src = cv::Mat( cv::Size( ACQ_WIDTH,CV_8U );
cv::Mat dx;

// Point Mat to buffer data
src.data = (uchar*)(bufObject->address);

// Create clone
cv::Mat cl = src.clone() ;

// Calculate x-gradient
cv::Sobel( cl,BORDER_REPLICATE ) ;

数据源没问题:imshow(src) 和 imshow (fm) 都正确显示了缓冲区,并且如前所述,如果使用克隆而不是原始图像,一切正常。

由于这是一个时间敏感的应用程序并且这是一个视频帧循环,我不想在每一步都克隆源。我错过了什么?

更新:

  • 如果使用 isContinuous() 函数检查,源和克隆 Mat 都会给出 TRUE。

  • total()、elemSize()、cols、rows、dims 和 flags 为源和克隆提供相同的结果

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)