C++代码
// file name: convert.cpp#include <opencv2/opencv.hpp>// BGR 转 YUVvoid BGR2YUV(const cv::Mat bgrImg, cv::Mat &y, cv::Mat &u, cv::Mat &v){cv::Mat out;cv::cvtColor(bgrImg, out, cv::COLOR_BGR2YUV);cv::bgr channel[3];cv::split(out, channel);y = channel[0];u = channel[1];v = channel[2];}// YUV 转 BGRvoid YUV2BGR(const cv::Mat y, const cv::Mat u, const cv::Mat v, cv::Mat& bgrImg){std::vector<cv::Mat> inChannels;inChannels.push_back(y);inChannels.push_back(u);inChannels.push_back(v);// 合并3个单独的 channel 进一个矩阵cv::Mat yuvImg;cv::merge(inChannels, yuvImg);cv::cvtColor(yuvImg, bgrImg, cv::COLOR_YUV2BGR);}// 使用例子int main(){cv::Mat origImg = cv::imread("test.png");cv::Mat y, u, v;BGR2YUV(origImg, y, u, v);cv::Mat bgrImg;YUV2BGR(y, u, v, bgrImg);cv::imshow("origImg", origImg);cv::imshow("Y channel", y);cv::imshow("U channel", u);cv::imshow("V channel", v);cv::imshow("converted bgrImg", bgrImg);cv::waitKey(0);return 0;}
编译
g++ -o convert convert.cpp --std=c++11 `pkg-config --cflags --libs opencv`./convert
Python代码
# file name: convert.pyimport cv2def bgr2yuv(img):yuv_img = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)y, u, v = cv2.split(yuv_img)return y, u, vdef yuv2bgr(y, u, v):yuv_img = cv2.merge([y, u, v])bgr_img = cv2.cvtColor(yuv_img, cv2.COLOR_YUV2BGR)return bgr_imgdef main():orig_img = cv2.imread('test.png')y, u, v = bgr2yuv(orig_img)bgr_img = yuv2bgr(y, u, v)cv2.imshow('orig_img', orig_img)cv2.imshow('Y channel', y)cv2.imshow('U channel', u)cv2.imshow('V channel', v)cv2.imshow('bgr_img', bgr_img)cv2.waitKey(0)if __name__ == '__main__':main()
运行程序:
python3 convert.py
https://vra.github.io/2019/12/19/opencv-bgr-yuv-conversion/#more
