refer to this page -> http://feelmare.blogspot.kr/2012/11/yuv-color-format-444-422-411-simple.html
In this article, I will introduce method of using opencv and TBB.
TBB is an acronym for Thread Building Block.
TBB is to enable parellel processing using multi thread.
see the this page -> http://feelmare.blogspot.kr/2014/12/opencv-tbb-utility-parallelfor.html
This is YUV422 to RGB example source code.
In my case YUV422 is consisted of YUYV.
And input type of the YUYV data is unsigned char *.
So example is
unsigned char * yuyv to Mat rgb
In here, m_stride is real width length of yuyv data.
....
Mat yuyv(m_height, m_width, CV_8UC2); memcpy( yuyv.data, yuyv_buffer, sizeof(unsigned char) * (m_stride * m_height) ); Mat rgb(m_height, m_width, CV_8UC3); cvtColor(yuyv, rgb, CV_YUV2BGR_YUYV);....
Next example is rgb to yuyv using TBB.
....
class Parallel_process : public cv::ParallelLoopBody { private: cv::Mat& inImg; unsigned char* outImg; int widhStep; int m_stride; public: Parallel_process(cv::Mat& inputImgage, unsigned char* outImage) : inImg(inputImgage), outImg(outImage){ widhStep = inputImgage.size().width * 3; m_stride = inputImgage.size().width *2; } virtual void operator()(const cv::Range& range) const { //thread for(int i = range.start; i < range.end; i++) { int s1 = i*widhStep; for(int iw=0; iw< inImg.size().width; iw=iw+2) { int s2 = iw*3; int mc = s1+s2; int B1 = (unsigned char)(inImg.data[mc + 0]); int G1 = (unsigned char)(inImg.data[mc + 1]); int R1 = (unsigned char)(inImg.data[mc + 2]); int B2 = (unsigned char)(inImg.data[mc + 3]); int G2 = (unsigned char)(inImg.data[mc + 4]); int R2 = (unsigned char)(inImg.data[mc + 5]); int Y = (0.257*R1) + (0.504*G1) + (0.098*B1) +16; int U = -(0.148*R1) - (0.291*G1) + (0.439*B1) + 128; int V = (0.439*R1 ) - (0.368*G1) - (0.071*B1) + 128; int Y2 = (0.257*R2) + (0.504*G2) + (0.098*B2) +16; Y = MMIN(255, MMAX(0, Y)); U = MMIN(255, MMAX(0, U)); V = MMIN(255, MMAX(0, V)); Y2 = MMIN(255, MMAX(0, Y2)); mc = i*m_stride + iw*2; outImg[mc + 0] = Y; outImg[mc + 1] = U; outImg[mc + 2] = Y2; outImg[mc + 3] = V; } } } }; //in main rutine cv::parallel_for_(cv::Range(0, (OriginMat).rows), Parallel_process((OriginMat), inP_OriginImg));....
In opencv convert function, YUYV to RGB option is exist (-> CV_YUV2BGR_YUYV).
But RGB to YUYV option is not exist.
thank you.
This comment has been removed by the author.
ReplyDeleteDoes not convert it correctly
ReplyDelete