从 std::vector<int> 模糊 Mat 的错误指针:cv::Exception

Bad pointers by blurring Mat from std::vector<int>: cv::Exception

我是openCV新手,试了好几个小时都没成功,希望大家多多指教。我正在尝试检测图像中的圆心,如下所述: https://solarianprogrammer.com/2015/05/08/detect-red-circles-image-using-opencv/

我在 Visual Studio 10 on Windows XP 和 OpenCV 2.2.0 中使用 C++。

我的图片采用 std::shared_ptr<CImg<double>> 格式,在白色背景上显示黑点。然后我将它们转换为 std::vector<int> vecImagePx 长度为 65536(256 rows/columns),数据值在 0 到 255 之间。我已验证一切正常。

接下来,我将矢量转换为 Mat,这是正确完成的。我通过查看 jpg 文件知道这一点,根据 Visual Studio 2010,指向 datastart 和 dataend 和数据的指针也未显示为错误指针,但似乎具有有效地址。另外,Mat 不为空:

//[...]
#include <opencv2\opencv.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\core\core.hpp>
//[...]
using namespace cv;
[...]

Mat tmpImage= Mat(vecImagePx, false).reshape(1, 256);
imwrite( "Image_0.jpg", tmpImage ); // Works fine
bool emptyImg=tmpImage.empty(); // Returns "false"

当我应用任何过滤器或阈值时,我立即收到错误:

medianBlur(tmpImage, tmpImage, 3); // Would give error
threshold(tmpImage, tmpImage, 128, 255, THRESH_BINARY); // Would give error

错误信息: ModulatedImaging.exe 中 0x7c812fd3 的未处理异常:Microsoft C++ 异常:cv::Exception 在内存位置 0x0011bc14.. 此外,根据 Visual Studio.

,指向数据、数据端等的指针现在是 0.0000 <Bad ptr.>

但是,使用相同的方法从随机值创建 Mat 效果很好。然而,将 tmpImage 分配给 R2 会产生与上述相同的错误:

Mat R2 = Mat(256, 256, CV_8UC1);
randu(R2, Scalar::all(0), Scalar::all(255));
medianBlur(R2, R2, 3); // Works fine
threshold(R2, R2, 128, 255, THRESH_BINARY); // Works fine

Mat tmpImage= Mat(vecImagePx, false).reshape(1, 256); // Works fine
imwrite( "Image_0.jpg", tmpImage ); // Works fine
R2=tmpImage; // Works fine
medianBlur(R2, R2, 3); // Gives error
threshold(R2, R2, 128, 255, THRESH_BINARY); // Gives error

我也有,例如尝试了从 std::vector<int>Mat 的以下转换,但是 jpg.-image 导致错误的条纹并且过滤器也不起作用:

cv::Mat tmpImage(256,256,CV_8UC1,&vecImagePx.front()); // results in wrong stripes

如何避免错误消息?

同时,我找到了解决方案:Mat tmpImage 数据类型 对于使用描述的过滤器不正确!使用 int type=tmpImage.type(); 和下面的 table 我发现 tmpImage mat 的类型是 CV_8UC3。但是,R2的类型是CV_8U1

使用 tmpImage.convertTo(tmpImage,CV_8UC1);tmpImage 的数据类型转换为 CV_8U1 解决了所有问题!

这是table我用来给某个数据类型赋值的整数类型:

*+--------+----+----+----+----+------+------+------+------+
|        | C1 | C2 | C3 | C4 | C(5) | C(6) | C(7) | C(8) |
+--------+----+----+----+----+------+------+------+------+
| CV_8U  |  0 |  8 | 16 | 24 |   32 |   40 |   48 |   56 |
| CV_8S  |  1 |  9 | 17 | 25 |   33 |   41 |   49 |   57 |
| CV_16U |  2 | 10 | 18 | 26 |   34 |   42 |   50 |   58 |
| CV_16S |  3 | 11 | 19 | 27 |   35 |   43 |   51 |   59 |
| CV_32S |  4 | 12 | 20 | 28 |   36 |   44 |   52 |   60 |
| CV_32F |  5 | 13 | 21 | 29 |   37 |   45 |   53 |   61 |
| CV_64F |  6 | 14 | 22 | 30 |   38 |   46 |   54 |   62 |
+--------+----+----+----+----+------+------+------+------+