2017-02-09 42 views
1

我正在玩opencv 3.2(對這個庫不熟悉),並注意到cv::Mat::at方法的一些奇怪的行爲。鍵入有關方法簽名myMat.at幫助筆記不QTcreator出現,但做露面的方法遍歷圖像的像素時Opencv cv:Mat :: at只允許修改圖像的一部分

第二其餘它修改圖像的只有某一部分時

1 (我會更好地展示截圖和代碼)

enter image description here

代碼

#include <QCoreApplication> 
#include <QDebug> 

#include <opencv2/opencv.hpp> 
#include <opencv2/core.hpp> 
#include <opencv2/imgproc.hpp> 
#include <opencv2/highgui.hpp> 
#include <opencv2/imgcodecs.hpp> 
#include <stdint.h> 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    cv::Mat orignalImg = cv::imread("/path/to/image/pic3.jpg", cv::IMREAD_ANYCOLOR); 
    cv::Mat modifiedImg = cv::imread("/path/to/image/pic3.jpg", cv::IMREAD_ANYCOLOR); 

    for (int r = 0; r < modifiedImg.rows; ++r) 
    { 
     for (int c = 0; c < modifiedImg.cols; ++c) 
     { 
      modifiedImg.at<uint8_t>(r, c) = modifiedImg.at<uint8_t>(r, c) * 0.2f; 
     } 
    } 

    cv::imshow("original", orignalImg); 
    cv::imshow("modified", modifiedImg); 
    cv::waitKey(0); 
    return a.exec(); 
} 

正如你所看到的,右側的圖像沒有被完全處理,但只是其中的一部分。

這是怎麼發生的? 根據代碼,它應該處理整個圖像。

我在那裏錯過了什麼?

+1

您正在使用'cv :: Mat :: at'不正確。你有顏色(即3通道圖像),但你在'''而不是'在'' –

+0

@DanMašek爲什麼是不正確的? 3通道意味着rgb顏色模型,它需要每個通道的無符號字符(0,255)是不是? – ampawd

+0

當然,但你沒有指定頻道,只有在訪問這些值時的行和列。 –

回答

3

你訪問Matat<uint8_t>(順便說一句,應使用過at<uchar>代替),這意味着該圖像是CV_8UC1類型的,即,1個通道(C1)與下面的式8位無符號的矩陣(8U )。

然而,你的是彩色圖像,這意味着它有3個信道(C3)與類型8位無符號(8U),這意味着8位用於表示每個顏色B,G,R(0:255)的。這意味着圖像的類型爲CV_8UC3,您應該使用at<cv::Vec3b>訪問它。

所以,你的代碼就變成了:

modifiedImg.at<Vec3b>(r, c) = modifiedImg.at<Vec3b>(r, c) * 0.2f; 

您也可避免掃描圖像,並直接使用:

modifiedImg = modifiedImg * 0.2f; 

您還可以使用imreadcv::IMREAD_COLOR(默認)一定要加載3個頻道的圖像。

+0

是的我在使用vec3b之前嘗試過,它按預期工作,但使用uchar時它仍然輸出相同的錯誤 – ampawd

+1

這不是一個錯誤,你只是做錯了。使用CV_8UC3矩陣的正確方法是使用Vec3b。 – Miki

+0

好的謝謝你的回答 – ampawd