簡體   English   中英

用戶在OpenCV中分配的數據的Mat構造函數

[英]Mat constructor from user allocated data in OpenCV

我正在嘗試使用此構造函數從內存中分配的一些數據創建Mat對象。

C++: Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP)

我對C ++相當陌生,因此如果我在某個地方犯了基本錯誤,請記住這一點。 基本上我想做的是顯示來自原始視頻文件的圖像。 為此,我從文件中讀取數據並將其分配到內存中。

struct videoFrame{
    float frameTime;
    unsigned short int year, day, msec;
    unsigned char hour, min, sec;
    unsigned short int mFrame[SIZE];
};

...

//seek to first frame
vfs.seekg(2560, ios_base::beg);
int pos;
for(pos=0; pos<SIZE;pos++){
    vfs.read( (char*) &mVideoFrame1->mFrame[pos], sizeof(short));
}
Mat mImage1( Size(WIDTH, HEIGHT), CV_16UC1, mVideoFrame1->mFrame, HEIGHT * 2);
namedWindow("Frame 1", CV_WINDOW_AUTOSIZE);
imshow("Frame 1", mImage1);
waitKey(0);

我已經能夠從文件中讀取數據...,例如視頻標題 我想我可能不清楚構造函數的工作方式。 如果有人可以提供一些見解,那將是很好的。 當我在namedWindow中顯示框架時,它全是黑色的。

順便說說...

const int HEIGHT = 512;
const int WIDTH = 640;
const int SIZE = HEIGHT * WIDTH * 2;

第一幀中的原始數據是512x640 16位無符號小字節序字節順序的黑白圖像。

step是圖像步幅的大小,等於或大於sizeof(_PIXELTYPE) * Width 您沒有指定問題,但我注意到您錯誤地將步長設置為2*HEIGHT 否則,您的構造函數用法似乎還可以。

編輯:當然,只是使用自動步為您計算默認步幅。

發現問題所在...文件中的數據為16位無符號,但是每個像素的范圍僅為12位。 因此,這就是窗口顯示為黑色的全部原因。

我想OpenCV不支持顯示12位無符號數據,因此我不得不將其轉換為8位無符號數據才能顯示。 是的,以塊而不是循環讀取所有像素數據要高效得多。

vfs.read( (char*) &mVideoFrame1->mFrame, sizeof(mVideoFrame1->mFrame));

Mat mImage1(HEIGHT, WIDTH, CV_16UC1, mVideoFrame1->mFrame, Mat::AUTO_STEP);
Mat mine(Size(640,512), CV_8UC1);
mImage1.convertTo(mine, CV_8UC1, 255.0/4095.0);
namedWindow("Frame 1", CV_WINDOW_AUTOSIZE);
imshow("Frame 1", mine);
waitKey(0);

是的,不是很辛苦

暫無
暫無

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

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