2013-02-22 87 views
0

我正嘗試使用持有32位ARGB幀的攝像頭緩衝區初始化Mat。這些是我至今採取的步驟:使用32位ARGB攝像頭緩衝區來初始化OpenCV Mat

cv::Mat src = cv::Mat(cv::Size(img_height, img_width),CV_8UC4); 
memcpy(src.ptr(), (void*) img_buffer,img_height * img_width * 4); 

cv::Mat dest= src.clone(); 

cv::cvtColor(src,dest,COLOR_BGRA2BGR); 

這導致段錯誤。即使dest被初始化爲

cv::Mat dest=cv::Mat(src.size(),src.type()); 

仍然會出現,希望對此有所幫助。

UPDATE

所以我想手動解開的順序,如:

int rgb_temp[4]; 
for(int y=0; y < (int)img_height; y++) { 
    for(int x=0; x < (int)img_width; x++) { 
     rgb_temp[0] = (unsigned int)img_buffer[(int)img_stride * y + x + 0]; // A 
     rgb_temp[1] = (unsigned int)img_buffer[(int)img_stride * y + x + 1]; // R 
     rgb_temp[2] = (unsigned int)img_buffer[(int)img_stride * y + x + 2]; // G 
     rgb_temp[3] = (unsigned int)img_buffer[(int)img_stride * y + x + 3]; // B 
     src.data[ (y + x) + 0] = rgb_temp[3]; // B 
     src.data[ (y + x) + 1] = rgb_temp[2]; // G 
     src.data[ (y + x) + 2] = rgb_temp[1]; // R 
     src.data[ (y + x) + 3] = rgb_temp[0]; // A 
    } 
} 

,但無濟於事。我能夠從img_buffer中讀取ARGB值,但無法寫入src.data。這是一個正確的方法嗎?

回答

1

您可以使用下面的結構:

Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP) 

,你的數據映射到OpenCV的格式,你的情況是這樣的:

cv::Mat src(img_height, img_width ,CV_8UC4, img_buffer) 
cv::Mat dst; 
src.copyTo(dst); 

,但要小心第一行不復制數據。

+0

我沒有使用img_buffer進行初始化的原因是因爲它不會複製數據並且其中包含的數據不能保證可用。 – 2013-02-22 13:15:15