【水到渠成C++】opencv基本操作 之 cv::MAt

1-获取图像尺寸、通道

cv::Mat src_rgba;
std::cout << "w: " << src_rgba.cols 
          << "h: " << src_rgba.rows 
          << "c: " << src_rgba.channels()
          << std::endl;

2-创建图像

cv::Mat img(INPUT_H, INPUT_W, CV_32F);  //有参构造
cv::Mat img;                            //无参构造
cv::Mat img = cv::imread("XXX.jpg");    //读图

3-归一化

(1)img/255-0

cv::Mat one;
img.convertTo(one, CV_32F, 1.0/255, 0);

(4)拆分

    cv::Mat img = cv::imread(argv[2]);    
    //2.拆分图片
    cv::Mat img_channels[3];
    split(img, img_channels);

    //3.区域图片混合
    cv::Mat img_blue = img_channels[0];
    cv::Mat img_gree = img_channels[1];
    cv::Mat img_red  = img_channels[2];

    cv::Mat one_img_blue;
    cv::Mat one_img_gree;
    cv::Mat one_img_red;
    img_blue.convertTo(one_img_blue, CV_32F, 1.0/58.395, -2.118);
    img_gree.convertTo(one_img_gree, CV_32F, 1.0/57.12, -2.036);
    img_red.convertTo(one_img_red, CV_32F, 1.0/57.375, -1.804);

    img_channels[0] = one_img_blue;
    img_channels[1] = one_img_gree;
    img_channels[2] = one_img_red;

     //4.图片组合
    cv::Mat img_merge;
    merge(img_channels, 3, img_merge);

(3)求范数

【详情】

void cv::normalize(InputArry src,
                InputOutputArray dst,
                double alpha=1,
                double beta=0,
                int norm_type=NORM_L2,
                int dtype=-1,
                InputArray mark=noArry())

4-查看图像元素

void showMat(cv::Mat &img){
    std::cout << "图像元素查看 : " << img.rows<<"," << img.cols <<std::endl;
    for (int i = 0; i<img.rows; i++)
    {
        for (int j = 0; j < img.cols; j++)
        {
            std::cout<< "("<<
                    (float)img.at<cv::Vec3f>(i, j)[0]<< ", " <<
                    (float)img.at<cv::Vec3f>(i, j)[1]<< ", " <<
                    (float)img.at<cv::Vec3f>(i, j)[2]<< ") " << std::endl;
                    //(int)img.at<cv::Vec3b>(i, j)[0]<< ", " <<
                    //(int)img.at<cv::Vec3b>(i, j)[1]<< ", " <<
                    //(int)img.at<cv::Vec3b>(i, j)[2]<< ") " << std::endl;
            }
        }
    }
}

5-图像缩放

6-图像裁剪

 

 

C++中实现OpenCV中3通道cv::Mat和std::vector相互转换的方法如下: 1. 将cv::Mat转换为std::vector: 可以使用模板方法convert_mat_to_vector,通过将cv::Mat使用reshape函数转换为一行的形式,然后进行类型转换即可。例如: ```cpp cv::Mat img = cv::imread("a.jpg"); std::vector<float> v = convert_mat_to_vector<float>(img); ``` 这样就可以将3通道的cv::Mat转换为std::vector。 2. 将std::vector转换为cv::Mat: 同样可以使用模板方法convert_vector_to_mat,首先将std::vector转换为单列的cv::Mat,然后使用reshape函数重新设置通道数和行数。例如: ```cpp cv::Mat dest = convert_vector_to_mat<float>(v, 3, img.rows); ``` 这样就可以将std::vector转换为3通道的cv::Mat。 需要注意的是,在转换过程中,为了避免浅拷贝问题,需要使用clone()函数进行深拷贝。 这样就完成了3通道cv::Mat和std::vector的相互转换。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [OpenCV - cv::Mat与unsigned char*数组或者float*数组相互转换,cv::Mat与std::vector的相互转换](https://blog.csdn.net/HW140701/article/details/131064164)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [opencv mat与std::vector互转](https://blog.csdn.net/qq_61862078/article/details/128883907)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值