opencv对图像的一些操作

#include<iostream>
#include<chrono>

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>

using namespace std;

int main(){
    // 读取图片
    cv::Mat image;
    image = cv::imread("test.jpg");
    // 判断图像文件是否正常读取
    if(image.data == NULL){
        cerr<<"文件不存在"<<endl;
    }

    // 输出基本信息
    cout<<"图像宽为 :"<<image.cols <<", 高为 : "<< image.rows <<" ,通道数为 : "<<image.channels() <<endl;
    // 显示
    cv::imshow("image",image);
    cv::waitKey(0);

    // 判断image的类型
    if(image.type() != CV_8UC1 && image.type() != CV_8UC3){
        // 图像不符合要求
        cout<<"请输入一张彩色图或者灰度图"<<endl;
        return 0;
    }

    // 遍历图片
    chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
    for(size_t y=0; y<image.rows; y++){
        for(size_t x=0; x<image.cols; x++){
            // 访问位于x,y处的像素
            // 用cv::Mat::Ptr获得图像的行指针
            unsigned char* row_ptr = image.ptr<unsigned char>(y);   // row_ptr是第y行的头指针
            unsigned char* data_ptr = &row_ptr[x*image.channels()]; // data_ptr指向带访问的数据像素
            // 输出该像素的每个通道
            for(int c=0; c!= image.channels(); c++){
                unsigned char data = data_ptr[c];   // data为(x,y)第c个通道的值
            }
        }
    }
    chrono::steady_clock::time_point t2 = chrono::steady_clock::now();
    chrono::duration<double> time_used = chrono::duration_cast<chrono::duration<double>>(t2-t1);
    cout<<"遍历用时 : "<<time_used.count() <<"秒"<<endl;


    // cv::Mat的拷贝
    // 直接赋值并不会复制数据
    cv::Mat img = image;
    // 修改img会导致image发生变化
    img(cv::Rect(0,0,100,100)).setTo(0);    // 将左上角100*100的像素块置零
    cv::imshow("image",image);
    cv::waitKey(0);

    // 使用clone函数来复制数据
    cv::Mat image_clone = image.clone();
    image_clone(cv::Rect(0,0,100,100)).setTo(255);
    cv::imshow("image",image);
    cv::imshow("image_clone",image_clone);
    cv::waitKey(0);

    cv::destroyAllWindows();
    
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值