2016-05-27 29 views
4

我試圖使用定義400x400的墊OpenCV的打印圖像:OpenCV的不承認墊尺寸

plot2 = cv::Mat(400,400, CV_8U, 255); 

但是當我嘗試打印點,一些奇怪的事情發生了。 y座標僅打印到前100個值。也就是說,如果我打印點(50,100),它不會在列的第100/400部分打印它,但在最後。不知何故,400列已變成100

例如,在運行此時:

for (int j = 0; j < 95; ++j){ 
    plot2.at<int>(20, j) = 0; 
} 
cv::imshow("segunda pared", plot2); 

顯示此(下劃線部分是對應於上面的代碼的部分):

IMAGE

當它應該佔據屏幕的95/400時,到95的線幾乎佔據了所有400點。

我在做什麼錯?

回答

6

您在定義cv::Mat,你說清楚,這是從類型CV_8U

plot2 = cv::Mat(400,400, CV_8U, 255); 

但是當你試圖將其打印出來,你是在告訴它的類型是int這通常是一個簽署32位未無符號8位。因此,解決辦法是:

for (int j = 0; j < 95; ++j){ 
    plot2.at<uchar>(20, j) = 0; 
} 

重要提示:注意,OpenCV的使用標準C++的類型不是固定的。因此,不需要使用像uint16_t或類似的固定尺寸類型。因爲在編譯OpenCV &時你的代碼在另一個平臺上都會一起改變。


BTW,的好方法之一,通過你的cv::Mat迭代是:

for (size_t row = 0; j < my_mat.rows; ++row){ 
    auto row_ptr=my_mat.ptr<uchar>(row); 
    for(size_t col=0;col<my_mat.cols;++col){ 
     //do whatever you want with row_ptr[col] (read/write) 
    } 
} 
+0

你確定了「重要提示」部分?你能否提供這些信息的來源?你是說如果你創建一個圖像爲'plot2 = cv :: Mat(400,400,CV_16U,255);'用'plot2.at (20,j)= 0訪問;'會出錯嗎?我不這麼認爲。 – Antonio

+0

很確定。我現在手裏沒有OpenCV代碼。並且在線搜索部分代碼很困難。現在看到這個http://stackoverflow.com/a/32663709/4523099我會盡力爲我的筆記稍後提供一些清晰的參考。 –

+0

非常感謝您指出這一點!我已經做了一些研究,我已經發布了我的結果作爲附加答案[有](http://stackoverflow.com/a/37484930/2436175)。我認爲你的答案可能會更精確一些:不應該使用'uint16_t',但是不清楚實際應該使用什麼(可能沒有簽名的short可能沒問題,但是在那一點上我更喜歡這種方法在我的答案中)。 – Antonio