繁体   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