本帖最后由 fansmit 于 2018-5-24 11:38 编辑
各位搞opencv的朋友,最新我着手搞camera 数字变焦的功能,由于接触时间不长所以有很多东西还不太懂,请帮忙解答下。
最近正在android系统上搞camera mjpeg数字变焦功能,目前的方案是从camera_hal中拿到从usb camera获取的一帧mjpeg数据,然后调用opencv接口,设置ROI 然后resize 再将缩放后的数据交给camera_hal 继续解码处理。这个流程之前处理yuv camera数据时是没问题的 所以流程长应该ok。根据网上我的理解是,如果是字节数据直接将其赋给结构体的imageData即可,但是在处理mjpeg数据后发现显示不出来了。先贴下我的代码流程:代码如下: (由于使用代码格式总是把我代码弄丢只好用文本格式,请见谅)
=================================== 代码区 ===================================
1 pZoomsrcIplImg = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3); //拿到的数据是1280 * 720
2 cvSetData(pZoomsrcIplImg, jpeg ,width*3); //jpeg是从camra中拿到的一帧数据 为char *类型
//使用fwrite将数据写到1.jpg中,在pc长可以正常打开显示,格式为YCbCr 422
3 write_jpg(pZoomsrcIplImg->imageData, "/data/1.jpg", size);
4 cvSetImageROI(pZoomsrcIplImg, cvRect(100, 100, 1000, 650)); //设置感兴趣的区间作为用于放大的区域
5 pZoomdstIplImg = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3);
6 cvResize(pZoomsrcIplImg, pZoomdstIplImg, CV_INTER_LINEAR);
//放大后的数据再通过fwrite写到2.jpg 发现图片不能显示了
7 write_jpg((char *)pZoomdstIplImg->imageData, "/data/2.jpg", pZoomdstIplImg->imageSize);
8 memcpy(buffer, pZoomdstIplImg->imageData, pZoomdstIplImg->imageSize); //将数据写到buffer中传给camera底层接着处理
=================================== 代码区 ===================================
开始我以为是因为我逻辑的问题,但后来我在第3行后执行了下cvLoadImage("/data/1.jpg"); 然后执行同样的步骤缩放后使用cvSaveImage("/data/2.jpg", pZoomdstIplImg)将缩放后的数据写成2.jpg 发现图片就是放大后的,可以正常显示。但之后我再将他的imageData 使用fwrite再写成jpg文件发现就不能正常显示了。
请问是不是cvLoadImage拿出来的数据和 结构体中imageData的数据格式并不一样,而opencv缩放图像需要的是cvLoadImage拿到的数据格式。那我应该如何转换才能正常显示。
|