前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenCV Code Snippets——BGR与YUV转换

OpenCV Code Snippets——BGR与YUV转换

作者头像
王云峰
发布2019-12-24 16:27:37
2K0
发布2019-12-24 16:27:37
举报
文章被收录于专栏:Yunfeng's Simple Blog

概述

OpenCV BGR 图 转 YUV 图的代码,网上没有比较完整的示例,使用的时候搜索比较费劲。这里写一个代码片段和例子,方便查找。

C++ 代码

在 Ubuntu 16.04 自己从源码编译的OpenCV 4.1.0 上测试通过,具体如下:

代码语言:javascript
复制
// 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;
}

在命令行用下面的命令来运行,查看代码有无问题:

代码语言:javascript
复制
g++ -o convert convert.cpp  --std=c++11 `pkg-config --cflags --libs opencv`
./convert

Python 实现

pip 安装的 OpenCV 4.1.2 上测试通过,具体如下:

代码语言:javascript
复制
# 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()

通过下面的命令来执行:

代码语言:javascript
复制
python3 convert.py
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-12-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • C++ 代码
  • Python 实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档