OpenCV基础大全,一看就会,超详细

1.图片的读取与显示

  1. 描述
    1. imread-读取图像
      1. 读取的图像均为Mat数据
      2. 参数(地址,加载图片的模式) 模式——彩色、灰度、透明通道、浮点加载
      3. 有时候通过上述函数显示的图片过大,所以要进行下面的操作
        1. nameWindow("输入窗口", WINDOW_FREERATIO)——自动将图像调整,并完整的显示出来
    2. imshow-显示图像
      1. 窗口名称,待显示对象
    3. waitkey(0) 程序运行到该位置阻塞,图像一直显示
      1. waitkey(1) 图像显示1ms,之后消失
    4. destroyAllWindows() 销毁所有窗口

2.图像色彩空间转换

  1. 色彩空间转换函数—cvtColor
    1. cvtColor(image, hsv, COLOR_BGR2HSV) 从BGR转换到HSV
      1. H 0~180 S,V 0·255 取值
      2. H:色调,S:饱和度,V:亮度
        1. 如果对图片的亮度进行调节,那么先进入HSV空间,之后对V通道进行调节即可。
    2. cvtColor(image, gray, COLOR_BGR2GRAY) 从BGR转换到GRAY
  2. 图像保存—imwrite
    1. imwrite(保存路径,保存的图片Mat)

3.图像的创建与复制

  1. 两种图像的创建方式

    1. Mat m1 = Mat::zeros(Size(8,8), CV_8UC1)

      1. 创建了8*8的空白(全0)图像,该图像的数据类型为uchar,1通道
    2. Mat m2 = Mat::ones(Size(8,8), CV_8UC3)

      1. 创建了8*8的图像(其中只有第一通道全为1,其余通道为0),该图像的数据类型为uchar,3通道

      2. 每一个位置有三个数值,并且排列在一起

        在这里插入图片描述

      3. 若想将剩余的位置填入数值,可以使用m2 = Scalar(127, 127, 127),此时m2为:
        在这里插入图片描述

  2. 图像的赋值

    1. 浅复制

      Mat m1;
      m1 = Scalar(0, 0, 255);   //红色
      Mat m2 = m1;
      m2 = Scalar(0, 255, 255); //黄色,此时m1也变为黄色
      
    2. 深复制

      Mat m1;
      m1 = Scalar(0, 0, 255);   //红色
      Mat m2 = m1.clone();    //等价于m1.copyTo(m2);
      m2 = Scalar(0, 255, 255); //黄色,此时m1仍为红色;
      

4.图像像素的读写操作

  1. 图像遍历之指针

    1. 图像在(row, col)处的像素值 image.at<uchar>(row, col) — uchar代表数据类型

      1. 利用指针遍历 uchar* current_row = image.ptr<uchar>(row) — 代表图像第row行的地址
        1. *current_row代表取第row行首元素的值
        2. *current_row++代表取第row行首元素的值,之后地址+1
      2. image.ptr<uchar>(row, col) — 错误,只能写到行
      Mat image;
      for(int row = 0; row < rows; row++)
      {
          uchar* current_row = image.ptr<uchar>(row);
          for(int col = 0; col < cols; col++)
          {
              if(image.channels() == 1)
              {
                  int pv = *current_row;
                  *current_row++ = 255 - pv;
              }
              if(image.channels() == 3)
              {
                  *current_row++ = 255 - *current_row;
                  *current_row++ = 255 - *current_row;
                  *current_row++ = 255 - *current_row;
              }
          }
      }
      
  2. 图像遍历之数组

    1. 当通道为3时,提取某个位置的数据时,该数据类型为:Vec3b

      Mat image;
      for(int row = 0; row < rows; row++)
      {
          for(int col = 0; col < cols; col++)
          {
              if(image.channels() == 1)
              {
                  int pv = image.at<uchar>(row, col);
                  image.at<uchar>(row, col) = 255 - pv;
              }
              if(image.channels() == 3)
              {
                  Vec3b bgr = image.at<Vec3b>(roe, col);
                  image.at<Vec3b>(row, col)[0] = 255 - bgr[0];
                  image.at<Vec3b>(row, col)[1] = 255 - bgr[1];
                  image.at<Vec3b>(row, col)[2] = 255 - bgr[2];
              }
          }
      }
      

5.图像像素的基本操作

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值