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

Tags: