[英]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.