2014-10-28 100 views
0

對此有點麻煩。舉一個簡單的例子,假設我想查找灰度圖像的亮度值,並將它們寫入一個新的陣列,但是說改變一定的亮度。我將如何去做這個與opencv?我一直沿着這行一些嘗試和做法:將像素值寫入空白矩陣

int main(int argc, char** argv){ 

    Mat img = imread(argv[1], CV_LOAD_IMAGE_UNCHANGED), img_grey, dst; 

    if (img.empty()) 
    { 
     return -1; 
    } 

    cvtColor(img, img_grey, CV_BGR2GRAY); 

    dst = Mat::zeros(img_grey.size(), img_grey.type()); 

    for 
     (int x = 1; x < dst.rows - 1; x++) 
    { 
     for (int y = 1; y < dst.cols - 1; y++) 
     { 

      dst.at<uchar>(y, x) = x; 

     } 
    } 

    namedWindow("New", CV_WINDOW_AUTOSIZE); 
    namedWindow("Original", CV_WINDOW_AUTOSIZE); 

    imshow("New", dst); 
    imshow("Original", img); 



    waitKey(0); 
    return 0; 

} 
+0

似乎很好,當我蓋了,但我得到這個錯誤:Microsoft C++異常:在0x000007FEFD00940D在將Test.exe 第一次機會異常CV ::異常的內存位置0x00000000001BF4C0。 如果有這種異常的處理程序,程序可能會安全地繼續。 – 2014-10-28 11:37:38

回答

1

既然你訪問圖像的方式,你應該改變

dst.at<uchar>(y, x) = x; 

dst.at<uchar>(x, y) = x; 

查看Mat::at()瞭解更多信息。


編輯:@Micka指出的那樣,你真的應該重命名xy因爲x通常假定爲橫軸,對應於「列方向」。正常使用情況下,會像:

for(int y = 0; y < mat.rows; y++) 
    for(int x = 0; x < mat.cols; x++) 
     mat.at<uchar>(y,x) = ...; 
+0

完美,謝謝。 – 2014-10-28 11:45:51

+2

你真的應該重新命名你的x和y,因爲x通常被認爲是水平軸,這對應於「列方向」 – Micka 2014-10-28 12:03:22

+0

@Micka好點,並在答案中加上了清楚。 – herohuyongtao 2014-10-28 12:09:34