簡體   English   中英

將unsigned char * image轉換為OpenCV Mat的問題

[英]Issue converting unsigned char * image to OpenCV Mat

我有一個問題是將圖像數據從幀抓取器解析為OpenCV Mat格式。 我可以從我的EDT幀抓取器獲取圖像數據作為無符號字符指針並將其傳遞給新創建的Mat,但我在此過程中丟失了有價值的數據,我不知道如何修復它。

我的相機是紅外相機,可輸出12位320x256拜耳圖像。 我相信我使用EDT的API是正確的。 使用EDT的軟件“pdvshow”,我可以按預期查看圖像數據,但是當我將返回的幀從EDT的API轉換為OpenCV Mat並顯示它時,我丟失了大量數據。 當我將Mat設置為CV16UC1時,框架接近黑色,當Mat設置為CV8UC1時,框架顯示大多數數據但看起來非常顆粒狀,並且一些斑點完全被吹滅。 我知道幀抓取器將每個12位像素存儲在兩個字節中,並且數據是MSB對齊的。 GetStride返回0。

unsigned char *pdvImage;
pdvImage = pdv_image(pdv_p); 

cv::Mat freshFrame;
freshFrame = cv::Mat(GetHeight(), GetWidth(), CV_16UC1, pdvImage, GetStride()); //was CV_16UC1 but 8UC1 shows more data

return freshFrame.clone();

我編寫了一個代碼,用於繪制char *圖像,然后將其轉換為OpenCV Mat:

const int WIDTH = 800, HEIGHT = 600;

uchar *data = new uchar[WIDTH * HEIGHT * 3];

for (int i = 0; i < WIDTH*HEIGHT*3;i+=3)
{
    if (i < WIDTH*HEIGHT*3/2)
    {
        data[i + 0] = (uchar)0;
        data[i + 1] = (uchar)0;
        data[i + 2] = (uchar)255;
    }
    else
    {
        data[i + 0] = (uchar)255;
        data[i + 1] = (uchar)0;
        data[i + 2] = (uchar)0;
    }
}

cout << "May God be pleased with you, amen!\n";

Mat colorfrm = Mat(HEIGHT, WIDTH, CV_8UC3);
colorfrm.data = data;

while (1)
{
    imshow("Original Image", colorfrm);

    /////////

    int c = cvWaitKey(30);
    if (c == ' ')
    {
        break;
    }
    if (c == 'q' || c == 'Q' || c == 27)
    {
        return 0;
    }
}

我希望這會有所幫助!

當您創建freshFrame作為CV_16UC1墊,數據的12位是在最顯著位。 縮放數據將解決產生的圖像顯得太黑的問題。 而不是

return freshFrame.clone();

你需要

return freshFrame * 16;

您可能還需要檢查pdvImage每個像素的兩個字節的字節順序。

關於CV_8UC1,這將不起作用

freshFrame = cv::Mat(GetHeight(), GetWidth(), CV_8UC1, pdvImage, GetStride()); 

因為pdvImage的前兩個字節構成了圖像中第一個像素的值,但卻成為了freshFrame中的兩個獨立像素。 但是,如果您在上面的行中創建freshFrame ,則第一個字節將成為freshFrame第一個像素的值,第二個字節將成為第二個像素的值,依此類推。 顯然這是錯誤的。 如果你真的需要一個CV_8UC1 Mat,最簡單的可能是創建一個CV_16UC1 Mat然后轉換它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM