从 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 |
+--------+----+----+----+----+------+------+------+------+
我是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 |
+--------+----+----+----+----+------+------+------+------+