OpenCV Code Snippets——BGR與YUV轉換
- 2019 年 12 月 24 日
- 筆記
概述
OpenCV BGR 圖 轉 YUV 圖的程式碼,網上沒有比較完整的示例,使用的時候搜索比較費勁。這裡寫一個程式碼片段和例子,方便查找。
C++ 程式碼
在 Ubuntu 16.04 自己從源碼編譯的OpenCV 4.1.0 上測試通過,具體如下:
// 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); bgr 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 實現
在 pip 安裝的 OpenCV 4.1.2 上測試通過,具體如下:
# 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

