2014-03-01 90 views
-1
cvCvtColor(img,dst,CV_RGB2YCrCb); 
    for (int col=0;col<dst->width;col++) 
    { 
     for (int row=0;row<dst->height;row++) 
     { 
      int idxF = row*dst->widthStep + dst->nChannels*col; // Read the image data 
      CvPoint pt = {row,col}; 
      temp_ptr2[0] += temp_ptr1[0]* 0.0722 + temp_ptr1[1] * 0.7152 +temp_ptr1[2] *0.2126 ; // channel Y 
     } 
    } 

但結果是這樣的:增加亮度並沒有產生預期的效果

enter image description here

請幫助我在哪裏去了?

回答

1

很多說這個代碼示例:

  • 首先,您使用的是舊的C風格的API(IplImage指針,cvBlah功能等),這是過時的和更難以維護(尤其是內存泄漏很容易引入),所以您應該考慮使用C++風格的結構和函數(cv::Mat結構和cv::blah函數)。

  • 您的錯誤可能來自於指令cvCopy(dst,img);的一開始。這會在開始處理之前沒有任何東西填充輸入圖像,所以您應該刪除此行。

  • 爲了獲得最大速度,您應該顛倒兩個循環,以便首先遍歷行然後遍歷列。這是因爲OpenCV中的圖像逐行存儲在內存中,因此通過增加列來訪問圖像對於緩存使用來說效率更高。

  • 臨時變量idxF從未使用過,所以你或許應該刪除以下行過:當您訪問圖像數據的像素存儲在temp_ptr1temp_ptr2

    int idxF = row*dst->widthStep + dst->nChannels*col; 
    
  • ,你換的位置座標爲xy。你應該訪問圖像以下列方式:

    temp_ptr1 = &((uchar*)(img->imageData + (img->widthStep*pt.y)))[pt.x*3]; 
    
  • 你永遠不釋放分配給dst內存,因此引入應用程序中的內存泄漏。在您的功能結束時致電cvReleaseImage(&dst);