2011-10-12 90 views
3

我試圖將從Basler相機捕獲的幀轉換爲OpenCV的Mat格式。沒有很多的來自巴斯勒API文檔的信息,但這些都是在巴斯勒例子中,兩行應在確定什麼是有用的輸出格式爲:將Basler圖像轉換爲OpenCV

// Get the pointer to the image buffer 
const uint8_t *pImageBuffer = (uint8_t *) Result.Buffer(); 
cout << "Gray value of first pixel: " << (uint32_t) pImageBuffer[0] << endl << endl; 

我知道像什麼格式是(目前設置爲單聲道8位),並嘗試過:

img = cv::Mat(964, 1294, CV_8UC1, &pImageBuffer); 
img = cv::Mat(964, 1294, CV_8UC1, Result.Buffer()); 

兩者都不起作用。任何建議/意見將不勝感激,謝謝!

編輯:我可以通過訪問像素巴斯勒圖像:

for (int i=0; i<1294*964; i++) 
    (uint8_t) pImageBuffer[i]; 

如果它轉換爲OpenCV中的墊格式幫助。

+0

你是什麼意思,它不起作用?它是否會崩潰,或者您是否獲得了圖案圖像(即,您關閉了幾行或幾列甚至是幾個通道)?你可以發佈輸出嗎?它看起來像使用1294x964的全幀參數。這些真正有效的行是由Basler返回的,還是它們是前/後有效的行,它是1280x960?相機是提供分色輸出還是單色? – mevatron

+0

嗨,代碼編譯和運行,但如果我嘗試使用'cv :: imshow()'顯示圖像,我得到一個錯誤窗口彈出說「basler_camera.exe已停止工作」。 1294 * 964是相機的最高分辨率,因此是正確的。我相信問題是從'pImageBuffer'複製到'img',但不知道如何正確執行。 –

回答

6

您正在創建cv圖像以使用相機的內存 - 而不是擁有自己內存的圖像。問題可能是相機正在鎖定該指針 - 或者可能希望重新分配並將其移動到每個新圖像上

嘗試創建沒有最後一個參數的圖像,然後使用memcpy將像素數據從相機複製到圖像()。

// Danger! Result.Buffer() may be changed by the Basler driver without your knowing   
const uint8_t *pImageBuffer = (uint8_t *) Result.Buffer(); 

// This is using memory that you have no control over - inside the Result object 
img = cv::Mat(964, 1294, CV_8UC1, &pImageBuffer); 

// Instead do this 
img = cv::Mat(964, 1294, CV_8UC1); // manages it's own memory 

// copies from Result.Buffer into img 
memcpy(img.ptr(),Result.Buffer(),1294*964); 

// edit: cvImage stores it's rows aligned on a 4byte boundary 
// so if the source data isn't aligned you will have to do 
for (int irow=0;irow<964;irow++) { 
    memcpy(img.ptr(irow),Result.Buffer()+(irow*1294),1294); 
} 
+0

嗨,你能提供一個你的意思嗎?謝謝 –

+0

感謝您的代碼。不幸的是,這似乎不起作用,因爲圖像不被複制。 (int i = 0; j (i,j)=((int i = 0; i

+1

你有'memcpy'參數錯誤的方式。它應該是'memcpy(img.ptr(),Result.Buffer(),basler_width * basler_height)'。函數定義是'memcpy(目標,源,長度)。 – misha