我是新來的openCV和實驗了幾個小時,但沒有成功,所以我希望你能給我一些建議。我試圖在這裏描述的圖像中檢測圓心: https://solarianprogrammer.com/2015/05/08/detect-red-circles-image-using-opencv/通過模糊從Mat錯誤墊指針::矢量<int>:cv ::異常
我在Windows XP和OpenCV 2.2.0的Visual Studio 10中使用C++。
我的圖片進來std::shared_ptr<CImg<double>>
格式顯示在白色背景上的黑點。然後我將它們轉換爲長度爲65536(256行/列)的std::vector<int> vecImagePx
,數據值介於0和255之間。我已驗證一切正常。
接下來,我將矢量轉換爲Mat,這是正確完成的。我通過查看jpg文件瞭解了這一點,根據Visual Studio 2010,指向數據發佈和數據結束以及數據的指針也不會顯示爲壞指針,但似乎有有效的地址。此外,墊不爲空:
//[...]
#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++異常:內存位置0x0011bc14處的異常cv :: 此外,根據Visual Studio指向數據,數據結束等的指針現在爲0.0000 <Bad ptr.>
。
但是,使用相同的方法從隨機值中創建一個Mat可以很好地工作。
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
我也有例如:然而,分配給tmpImage
R2
如上所述給出了同樣的錯誤試圖從std::vector<int>
以下轉化爲Mat
,但在錯誤的條紋和過濾器的jpg.圖像效果不工作,以及:
cv::Mat tmpImage(256,256,CV_8UC1,&vecImagePx.front()); // results in wrong stripes
我能做些什麼,以避免該錯誤消息?