专栏首页Yunfeng's Simple BlogOpenCV Code Snippets——BGR与YUV转换

OpenCV Code Snippets——BGR与YUV转换

概述

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • A Simple Introduction to Make

    GNU Make is a tool which controls the generation of executables and other non-so...

    王云峰
  • GPU并行计算和CUDA编程(2)-GPU体系架构概述

    MathJax.Hub.Config({ extensions: ["tex2jax.js"], jax: ["input/TeX", "...

    王云峰
  • c++11新特性:default和delete

    什么,delete居然还有这种神奇的用法?我确实以前没看过。所以我跑到实验室,自己查了些资料,大概明白这些代码是个什么意思了,所以记录下来。

    王云峰
  • 太实用了!自己动手写软件——密码验证器的界面实现

    我们今天的目标很简单,就是先把软件的界面设计和写出来,并不关心每一个按钮和输入框之后的功能实现。我设计一个这样的界面(极其简单,只是实现功能)

    菜鸟小白的学习分享
  • Python中socket网络通信是干嘛的

    在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织...

    砸漏
  • 几款更换WordPress 后台UI 的插件推荐

    WordPress 3.8出来了,最大的改变就是全新扁平化后台UI。如果你对这个后台UI 不怎么感冒甚至有些反感(尼玛怎么那么丑啊?!)不妨用下面的插件来尽可能...

    Jeff
  • 业界 | 中国芯片研发新突破:全球首台超分辨光刻装备研制成功

    11月29日,中科院光电技术研究所宣布,其承担的国家重大科研装备研制项目“超分辨光刻装备研制”通过验收。

    大数据文摘
  • python字符串总结

    格式 描述 格式 描述 %% 百分号%标记(多出来的%是转义作用)     %c 字符及其ASCII码 %s 字符串 %d 有符号整数(十进制) %u 无符号整...

    用户7886150
  • 玩转 PHP 网络编程全套阻塞与非阻塞 IO

    上一篇我们撸了不咋样的TCP server,然后还扯了半天的口水,现在呢我们来继续撸客户端

    桶哥
  • 【Python之旅】第五篇(一):Pyt

        只要和网络服务涉及的,就离不开Socket以及Socket编程,下面就说说Python Socket通信的基本原理。

    py3study

扫码关注云+社区

领取腾讯云代金券