2016-11-10 25 views
0

我是新來的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 

我也有例如:然而,分配給tmpImageR2如上所述給出了同樣的錯誤試圖從std::vector<int>以下轉化爲Mat,但在錯誤的條紋和過濾器的jpg.圖像效果不工作,以及:

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

我能做些什麼,以避免該錯誤消息?

回答

0

與此同時,我發現解決方案:數據類型Mat tmpImage是不正確的使用所述的過濾器!使用int type=tmpImage.type();和下表我發現tmpImage mat的類型是CV_8UC3。但是,R2的類型是CV_8U1

tmpImage數據類型轉換爲使用CV_8U1tmpImage.convertTo(tmpImage,CV_8UC1);解決了所有的問題!

這是我用於將類型整數分配給特定的數據類型的表:

*+--------+----+----+----+----+------+------+------+------+ 
|  | 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 | 
+--------+----+----+----+----+------+------+------+------+