使用opencv处理android中的yuv420sp(NV21)图像
来源:互联网 发布:网络转载犯法吗 编辑:程序博客网 时间:2024/06/18 18:50
NV21属于YUV420格式,是一种two-plane模式,即Y和UV分为两个Plane,但是UV(CbCr)为交错存储,每四个Y共用一组UV分量。 ,即Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00。所以,他的容量应该是 y:u:v=4:1:1,即rgb容量的一半。
处理的大概流程是,分离y通道和uv通道,然后对uv通道缩放至正常大小后,分离uv通道,然后合并y,u,v三个通道,最后调用转换函数转换为rgb的图像
下面先给出javacv的测试代码
public static IplImage TransNV21TOIplImage(byte[] buff, int height, int width) {//拆分数组,氛围y数组和uv数组byte[] y = new byte[width * height];byte[] uv = new byte[width * height / 2];int index = 0;System.arraycopy(buff, index, y, 0, width * height);index += width * height;System.arraycopy(buff, index, uv, 0, width * height / 2);//定义一个y通道的图像和一个uv双通道的图像IplImage yimg = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1);IplImage uvimg = cvCreateImage(cvSize(width / 2, height / 2),IPL_DEPTH_8U, 2);yimg.imageData().put(y);uvimg.imageData().put(uv);//将uv通道的图像从1/4大小,缩放到正常大小IplImage fulluvimg = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 2);cvResize(uvimg, fulluvimg, CV_INTER_LINEAR);cvReleaseImage(uvimg);//分离uv通道,用于下一步合并y通道IplImage uuimg = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1);IplImage vvimg = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1);cvSplit(fulluvimg, uuimg, vvimg, null, null);//将y,u,v通道合并IplImage yuvimg = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3);cvMerge(yimg, uuimg, vvimg, null, yuvimg);//将yuv格式转换为常用的rgb格式IplImage rgbimg = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3);cvCvtColor(yuvimg, rgbimg, CV_YCrCb2BGR);return rgbimg;}
通常情况下android上javacv的兼容性不是特别好,所以通常采用opencv4j+ndk的方式
IplImage* TransNV21TOBGR(char* buff, int height, int width) {IplImage* yimg = cvCreateImageHeader(cvSize(width, height), IPL_DEPTH_8U, 1);IplImage* uvimg = cvCreateImageHeader(cvSize(width / 2, height / 2),IPL_DEPTH_8U, 2);cvSetData(yimg, buff, width);cvSetData(uvimg, buff + width * height, width);IplImage* fulluvimg = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 2);cvResize(uvimg, fulluvimg, CV_INTER_LINEAR);cvReleaseImageHeader(&uvimg);IplImage* uimg = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1);IplImage* vimg = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1);cvSplit(fulluvimg, uimg, vimg, NULL, NULL);cvReleaseImage(&fulluvimg);IplImage* ycrcbimage = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U,3);cvMerge(yimg, uimg, vimg, NULL, ycrcbimage);cvReleaseImageHeader(&yimg);cvReleaseImage(&uimg);cvReleaseImage(&vimg);IplImage* rgbimg = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3);cvCvtColor(ycrcbimage, rgbimg, CV_YCrCb2BGR);cvReleaseImage(&ycrcbimage);return rgbimg;}
测试代码在处理864*480的图像时候,大概耗时500ms左右,效率不是特别高,暂时也没办法优化了
0 0
- 使用opencv处理android中的yuv420sp(NV21)图像
- NV21 to NV12(YUV420SP)
- 关于Opencv图像的转换(YUV420sp)
- Android上使用OpenCV处理图像
- Android上使用OpenCV处理图像
- Android -- 将NV21图像保存成JPEG
- opencv-OpenCV中的图像处理 [1]
- vs2013在图像处理中的应用(6):使用OpenCV进行图像处理
- Android nv21
- 【图像处理】颜色转换 nv21转rgb rgb转lab
- opencv-OpenCV中的图像处理 [2]-OpenCV中的轮廓
- android中的图像处理
- Android中的图像处理
- YUV420SP图像旋转算法
- NV21转BGR图像
- OpenCV 处理内存中的图像数据
- OpenCV中的图像处理 [3]-OpenCV中的直方图
- android 使用NDK进行图像处理(openCV)时的图像转换问题(灰度图显示)
- utm工具(astah 6.7)安装包,破解版(-)
- python 调用 shell python shell 间变量传递
- JAVA环境变量JAVA_HOME、CLASSPATH、PATH设置详解
- What exactly is the difference between “pass by reference” in C and in C++?
- 登录页面缓存,等待
- 使用opencv处理android中的yuv420sp(NV21)图像
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File
- Android横竖屏切换中的状态恢复------不调用Oncreate()的方式
- c# 在类中将数据传递给窗体
- 修改 Ubuntu 用户的 Shell
- 信息论中的一些基本知识
- bump Mapping Using CG(3rd Edition)
- 网络首发cocos2d-x手游《打小三》V1.0版本的win32版本
- Kill Process in Linux or Terminate a Process in UNIX / Linux Systems