2013-05-07 100 views
6

我非常熟悉OpenCV 1.1中使用的IPL圖像格式。不過,我正在使用最新的2.4版本,並希望切換到OpenCV的C++接口。這裏是我訪問圖像中的像素的方法:從IPLImage到Mat

int step = img->widthStep; 
int height = img->height; 
int width = img->width; 
unsigned char* data = (unsigned char*) img->imageData; 

for (int i=0; i<height; i++) 
{ 
    for (int j=0; j<step; j+=3)   // 3 is the number of channels. 
    { 
     if (data[i*step + j] > 200)  // For blue 
      data[i*step + j] = 255; 

     if (data[i*step + j + 1] > 200) // For green 
      data[i*step + j + 1] = 255; 

     if (data[i*step + j + 2] > 200) // For red 
      data[i*step + j + 2] = 255; 
    } 
} 

我需要將這個精確的代碼塊轉換爲Mat結構的幫助。我在這裏和那裏發現了幾個函數,但是如果我將整個上面幾行的確切轉換完成,這將非常有用。

回答

8
// Mat mat; // a bgr, CV_8UC3 mat 

for (int i=0; i<mat.rows; i++) 
{ 
    // get a new pointer per row. this replaces fumbling with widthstep, etc. 
    // also a pointer to a Vec3b pixel, so no need for channel offset, either 
    Vec3b *pix = mat.ptr<Vec3b>(i); 
    for (int j=0; j<mat.cols; j++) 
    { 
     Vec3b & p = pix[j]; 
     if (p[0] > 200) p[0] = 255; 
     if (p[1] > 200) p[1] = 255; 
     if (p[2] > 200) p[2] = 255; 
    } 
} 
3

首先,您可以對IPLImage執行相同的操作,並使用Mat的內置構造函數對其進行轉換。

其次,您的代碼似乎過於複雜,因爲您對所有3個維度都進行相同的操作。以下是(在馬太福音符號)整潔:

unsigned char* data = (unsigned char*) img.data; 

for (int i = 0; i < image.cols * image.rows * image.channels(); ++i) { 
    if (*data > 200) *data = 255; 
    ++data; 
} 

如果你想爲渠道THRES是不同的,那麼:

unsigned char* data = (unsigned char*) img.data; 
assert(image.channels() == 3); 

for (int i = 0; i < image.cols * image.rows; ++i) { 
    if (*data > 200) *data = 255; 
    ++data; 
    if (*data > 201) *data = 255; 
    ++data; 
    if (*data > 202) *data = 255; 
    ++data; 
} 
+0

在IPL圖像所做的一切,然後轉換回 - 將這種速度夠快嗎?我不希望這個過程需要一些額外的處理時間。而對於複雜的事情 - 這只是一個示例代碼,假設我需要爲紅色綠色和藍色給出不同的閾值。你的方法會工作嗎? – Soumyajit 2013-05-07 17:46:10

+1

當您在Mat和IplImage之間進行轉換時,您可以選擇是否複製數據。如果你不復制,開銷很小。即使你複製,我懷疑你的整個處理花費的時間超過1秒左右,開銷是顯着的。增加了不同的門檻。 – guinny 2013-05-08 12:19:24

+0

如果矩陣有一個步驟,則您的代碼不起作用。例如,爲創建爲另一個矩陣的ROI的矩陣標題。使用迭代器或行指針訪問來避免這種錯誤! – ypnos 2013-10-25 01:06:04