在OpenCV中实现YUV420sp2RGB
2017-07-12 19:05
686 查看
YUV420是视频设备常用的编码方式,其内部数据排列方式可参照此博客:图文详解YUV420数据格式
。
使用OpenCV内部函数cvCvtColor(对应OpenCV2函数名为cvtColor)可方便地实现RGB与YUV420两种格式之间的相互转换。但在转换过程中,我们需要关心YUV420的内部数据结构,即对于一张width×height的彩色图片来说,它的数据大小为width×height×1.5,其中前面width×height的空间为每个像素点的灰度信息,后面width×height/2的空间,存储的是每个点的色度信息,之所以占用空间这么少,是压缩的结果。知道了这一点,在进行RGB与YUV420的格式转换时,就不会出现空间分配错误的情况了。
第一部分
笔者所使用的OpenCV版本为OpenCV2.4.10,不同版本,OpenCV2头文件位置可能会有差异。
2.1
2.2
。
使用OpenCV内部函数cvCvtColor(对应OpenCV2函数名为cvtColor)可方便地实现RGB与YUV420两种格式之间的相互转换。但在转换过程中,我们需要关心YUV420的内部数据结构,即对于一张width×height的彩色图片来说,它的数据大小为width×height×1.5,其中前面width×height的空间为每个像素点的灰度信息,后面width×height/2的空间,存储的是每个点的色度信息,之所以占用空间这么少,是压缩的结果。知道了这一点,在进行RGB与YUV420的格式转换时,就不会出现空间分配错误的情况了。
第一部分
RGB2YUV
1.1 OpenCV1.0实现方法
#include <cv.h> #include <highgui.h> int main() { IplImage* src = cvLoadImage("D:/test.png"); IplImage* dst = cvCreateImage(cvSize(src->width, src->height / 2 * 3), 4000 IPL_DEPTH_8U, 1); cvCvtColor(src, dst, CV_RGB2YUV_I420); cvReleaseImage(&src); cvReleaseImage(&dst); cvWaitKey(0); return 0; }
1.2 OpenCV2实现方法
#include <opencv2\highgui\highgui.hpp> #include <opencv2\imgproc\imgproc.hpp> using namespace cv; int main() { Mat src = imread("D:/test.png"); Mat dst; cvtColor(src, dst, CV_RGB2YUV_I420); waitKey(0); return 0; }
笔者所使用的OpenCV版本为OpenCV2.4.10,不同版本,OpenCV2头文件位置可能会有差异。
第二部分 YUV2RGB
2.1
OpenCV1.0实现方法
#include <cv.h> #include <highgui.h> #include <iostream> using namespace std; #define WIDTH 720 #define HEIGHT 576 int main() { FILE* readFile; char filepath[100]; sprintf_s(filepath, "D:/test.yuv"); fopen_s(&readFile, filepath, "rb"); if (readFile == NULL) { cerr << "Open the YUV file failed" << endl; exit(1); } unsigned char* pRGB = (unsigned char*)malloc(WIDTH * HEIGHT * 1.5); fread(pRGB, 1, WIDTH * HEIGHT * 1.5, readFile); // 如果不是从文件中读取yuv数据,从这里开始看 IplImage* img = cvCreateImageHeader(cvSize(WIDTH, HEIGHT * 1.5), IPL_DEPTH_8U, 1); cvSetData(img, pRGB, WIDTH); IplImage* dst = cvCreateImage(cvSize(WIDTH, HEIGHT), IPL_DEPTH_8U, 3); cvCvtColor(img, dst, CV_YUV420sp2RGB); cvShowImage("Result", dst); cvWaitKey(0); free(pRGB); cvReleaseImageHeader(&img); cvReleaseImage(&dst); return 0; }
2.2
OpenCV2实现方法
#include <opencv2\highgui\highgui.hpp> #include <opencv2\imgproc\imgproc.hpp> #include <iostream> using namespace std; using namespace cv; #define WIDTH 720 #define HEIGHT 576 int main() { FILE* readFile; char filepath[100]; sprintf_s(filepath, "D:/test.yuv"); fopen_s(&readFile, filepath, "rb"); if (readFile == NULL) { cerr << "Open the YUV file failed" << endl; exit(1); } unsigned char* pRGB = (unsigned char*)malloc(WIDTH * HEIGHT * 1.5); fread(pRGB, 1, WIDTH * HEIGHT * 1.5, readFile); Mat src(HEIGHT * 1.5, WIDTH, CV_8UC1), dst; // 如果不是从文件中读取yuv数据,从这里开始看 memcpy(src.data, pRGB, WIDTH * HEIGHT * 1.5); cvtColor(src, dst, CV_YUV420sp2RGB); imshow("Result", dst); waitKey(0); free(pRGB); return 0; }
相关文章推荐
- OpenCV提供的转换函数实现YUV到RGB的转换
- OpenCV实现RGB与YUV的转换
- (原创)用verilog实现RGB格式图像到YCbCr或YUV格式的转换及其验证方法 (RGB2YCrCb)(RGB2YUV)
- yuv 到 32 位 rgb 的 快速转换算法基mmx 实现
- FFMPEG 实现 YUV,RGB各种图像原始数据之间的转换(swscale)
- FFMPEG 实现 YUV,RGB各种图像原始数据之间的转换(swscale)
- YUV格式转换为RGB(基于opencv)
- 用Shader实现的YUV到RGB转换:使用3重纹理实现
- 利用opencv将录制的rgb图像转化为yuv文件并保存。
- C++ OpenCV 实现RGB彩色图像转化成灰度图像再转换成二值图像
- 视频教程:YUV和RGB相互转换--MATLAB实现(一)
- FFMPEG 实现 YUV,RGB各种图像原始数据之间的转换(swscale
- RGB彩色图像与灰度图像转换 opencv实现 代码及分析
- 利用ov511的webeye v2000摄像头实现YUV420P格式转RGB24格式来抓取一张图片
- FFMPEG 实现 YUV,RGB各种图像原始数据之间的转换(swscale)
- 利用ov511的webeye v2000摄像头实现YUV420P格式转RGB24格式来抓取一张图片
- 图片颜色处理/ 关于RGB转换YUV的探讨与实现
- 【OpenGL】用OpenGL shader实现将YUV转RGB-(直接调用GPU实现,纯硬件方式,效率高)
- 【数字图像处理】YUV420转RGB并BMP存储<纯C++实现>
- 实现RGB,CMY(K),YUV,YIQ,YCbCr颜色的转换算法