OpenCV 代码段——BGR与YUV转换

https://zhuanlan.zhihu.com/p/98622289

概述

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

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);
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()

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的YUV格式视频编码的C++代码示例,使用了OpenCV库进行图像读取、处理和编码: ``` #include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/videoio.hpp> #include <opencv2/imgcodecs.hpp> #include <opencv2/imgproc.hpp> #include <opencv2/highgui.hpp> #include <opencv2/video.hpp> #include <vector> #include <fstream> using namespace std; using namespace cv; int main(int argc, char** argv) { // 读取视频文件 VideoCapture cap("input.mp4"); // 获取视频帧率和大小 int frame_width = (int)cap.get(CAP_PROP_FRAME_WIDTH); int frame_height = (int)cap.get(CAP_PROP_FRAME_HEIGHT); int fps = (int)cap.get(CAP_PROP_FPS); // 创建编码器对象 VideoWriter video("output.mp4", VideoWriter::fourcc('H', '2', '6', '4'), fps, Size(frame_width, frame_height), true); // 循环读取视频帧并编码 Mat frame; while (cap.read(frame)) { // 转换YUV格式 Mat yuv; cvtColor(frame, yuv, COLOR_BGR2YUV); // 分离YUV通道 vector<Mat> planes; split(yuv, planes); // 写入编码器 video.write(planes[0]); video.write(planes[1]); video.write(planes[2]); } // 释放资源 cap.release(); video.release(); return 0; } ``` 在上面的示例中,我们首先使用`VideoCapture`对象读取视频文件,然后获取视频帧率和大小。接下来,我们创建一个`VideoWriter`对象,用于将编码后的视频帧写入文件。在循环中,我们逐帧读取视频并将其转换YUV格式,然后将YUV通道分离并写入编码器。最后,我们释放资源并退出程序。 请注意,这仅是一个简单的示例,并且可能需要根据实际情况进行修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值