前一段时间,由于项目需要,将RGB888格式图像直接使用opencv显示出来,由于本人opencv新手,在网上查阅相关资料并结合自己的实际测试及使用情况做了如下记录,由于对opencv不了解,因此也不知道是否还有其他更简单的方法,如果有简单的办法,还望不吝赐教。
解决思路大致如下:
1、任选一张 *.bmp或 *.jpg等opencv能直接支持打开的图片,==注意,图片属性,比如分辨率、颜色通道这些需与待操作的RGB888一致。==使用imread()
函数将这些图片属性信息填入到Mat
类中。
2、使用文件操作方式读取待操作的RGB888图像数据,并存入提前申请好的临时内存中。
3、使用memcpy
将读取到RGB888数据拷贝纸Mat.data
当中,就可以正常显示了。
废话不多说,直接上代码:
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
size_t f_size = 0;
size_t ret = 0;
uchar* imgPtr = NULL;
FILE* fp;
// 要读入整个文件,必须采用二进制打开
fp = fopen("rgb1920", "rb");
// 获取文件大小
fseek(fp, 0, SEEK_END);
f_size = ftell(fp);
rewind(fp);
// 分配内存空间
imgPtr = new uchar[f_size];
// 获取文件内容
ret = fread(imgPtr, 1, f_size, fp);
if (ret != f_size)
{
fputs("Reading error", stderr);
exit(3);
}
//Mat test(1920, 1080, CV_8UC3);
Mat test = imread("test.bmp", IMREAD_COLOR); //载入图像到test
memcpy(test.data, imgPtr, f_size);
imshow("test", test);
waitKey(0);
delete[]imgPtr;
return 0;
}