C++代码
// file name: convert.cpp
#include <opencv2/opencv.hpp>
// BGR 转 YUV
void 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 转 BGR
void 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.py
import cv2
def bgr2yuv(img):
yuv_img = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
y, u, v = cv2.split(yuv_img)
return y, u, v
def yuv2bgr(y, u, v):
yuv_img = cv2.merge([y, u, v])
bgr_img = cv2.cvtColor(yuv_img, cv2.COLOR_YUV2BGR)
return bgr_img
def 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