C++ Opencv 图片运算和处理

色彩空间

RGB 和 BGR

opencv主要使用BGR,与其他显示设备RGB不同需注意,是产生颜色不对的原因所在。
opencv Mat的type()值参照表

- C1 C2 1C3 C4 C(5) C(6) C(7) C(8)
CV_8U 0 8 16 24 32 40 48 56
CV_8S 1 9 17 25 33 41 49 57
CV_16U 2 10 18 26 34 42 50 58
CV_16S 3 11 19 27 35 43 51 59
CV_32S 4 12 20 28 36 44 52 60
CV_32F 5 13 21 29 37 45 53 61
CV_64F 6 14 22 30 38 46 54 62

HSV 和 HSL

HSV:H(Hue)表示色相,S(saturation)表示饱和度,V(value)明度
在这里插入图片描述
HSL:H(Hue)表示色相,S(saturation)表示饱和度,L(lightness)亮度
在这里插入图片描述

YUV

YUV:主要用于视频处理,数据源Y代表灰色图像,U、V代表颜色

YUV4:2:0 表示没4个Y里,要么有2个U,要么有2个V
在这里插入图片描述

划线

#include <iostream>
#include <vector>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/video.hpp>
#include <NumCpp.hpp>

cv::Mat array2Img(nc::NdArray<uchar> array);

void main(){
   
	nc::NdArray<uchar> img_array = nc::NdArray<uchar>(40, 60);
   img_array.zeros();
    cv::Mat line_img;
    int count = 0;
    while (count < 30) {
   
        img_array(count ,9) = 255;      // blue
        img_array(count, 10) = 255;     // green
        img_array(count, 11) = 255;     // red
        count += 1;
    }
    for (size_t i = 0; i < img_array.numRows(); i++)
    {
   
        std::cout << "第" << i << ": ";
        for (size_t j = 0; j < img_array.numCols(); j++)
        {
   
            std::cout << (size_t)img_array(i, j);
        }
        std::cout << "\n";
    }
    line_img = array2Img(img_array);
    cv::namedWindow("line_img", cv::WINDOW_NORMAL);
    cv::imshow("line_img",line_img);
    cv::waitKey(0);
 }
 //数组转图片
cv::Mat array2Img(nc::NdArray<uchar> array) {
   
    
    size_t h = array.numRows();
    size_t w = array.numCols();

    cv::Mat img(h,(size_t)(w/3), CV_8UC3);     //保存为RGB
    for (size_t i = 0; i < h; i++)
    {
   
        uchar* tmp = img.ptr<uchar>(i);
        for (size_t j = 0; j < w; j++)
        {
   
            tmp[j] = array(i, j);
        }
    }
    return img;
}

在这里插入图片描述

3通道分割和合并

方法一

	std::vector<cv::Mat> channelsSplistArray, channelsMergeArray;
    cv::Mat buleChannel, redChannel, greenChannel,newAddchannel,imgMerge;
    //分割, 相应通道颜色的会转为灰色
    cv::split(line_img, channelsSplistArray);    // &
    buleChannel = channelsSplistArray.at(0);     // 0   255 255
    greenChannel = channelsSplistArray.at(1);    // 255 0   255 
    redChannel = channelsSplistArray.at(2);      // 255 255 0
    cv::imshow("buleChannel", buleChannel);
    cv::imshow("greenChannel", greenChannel);
    cv::imshow("redChannel", redChannel);
    // 合并三通道 设置blue为0
    newAddchannel = channelsSplistArray.at(0).clone();
    newAddchannel.setTo(0);
    channelsMergeArray.push_back(newAddchannel);
    channelsMergeArray.push_back(greenChannel);
    channelsMergeArray.push_back(redChannel);
    cv::merge(channelsMergeArray, imgMerge);
    // 当通道设置为0 : 0为blue 1为green 2为red
    /*channelsSplistArray[0] = cv::Scalar(0);      
    cv::merge(channelsSplistArray, imgMerge);*/
    cv::imshow("imgMerge", imgMerge);

方法二


    cv::Mat newAddchannel, imgMerge, imgChannelSplitArray[3];
    // 分割
    cv::split(line_img, imgChannelSplitArray)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值