zoukankan      html  css  js  c++  java
  • opencv学习笔记(一)

    摘要:最近要做一个和图像处理有联系的项目,从此走上了学习opencv的道路。

    灰度图:2维矩阵

    彩色图:3维矩阵

    ps:目前大部分设备都是用无符号 8 位整数(类型为 CV_8U)表示像素亮度

    Mat类定义:

    class CV_EXPORTS Mat
    {
    public:
     //一系列函数
     ...
     /* flag 参数中包含许多关于矩阵的信息,如:
     -Mat 的标识
     -数据是否连续
     -深度
     -通道数目
     */
     int flags;
     //矩阵的维数,取值应该大于或等于 2
     int dims;
     //矩阵的行数和列数,如果矩阵超过 2 维,这两个变量的值都为-1
     int rows, cols;
     //指向数据的指针
     uchar* data;
     //指向引用计数的指针
     //如果数据是由用户分配的,则为 NULL
     int* refcount;
     //其他成员变量和成员函数
     ...
    };
    

    单通道图像:元素类型一般为 8U(即 8 位无符号整数),也可以是 16S、32F 等;这些类型可以直接用 uchar、short、float 等 C/C++语言中的基本数据类型表达

    多通道图像:如RGB彩色图像,需要用三个通道来表示。在这种情况
    下,如果依然将图像视作一个二维矩阵,那么矩阵的元素不再是基本的数据类型。可以采用Vec类,表示一个向量。如8U类型的RGB彩色图像使用Vec3b。

    对于 Vec 对象,可以使用[]符号如操作数组般读写其元素,如:

    Vec3b color; //用 color 变量描述一种 RGB 颜色
    color[0]=255; //B 分量
    color[1]=0; //G 分量
    color[2]=0; //R 分量
    

    at()函数:实现读取矩阵中的某个像素,或者对某个像素进行赋值操作。

    uchar value = grayim.at<uchar>(i,j);//读出第 i 行第 j 列像素值
    grayim.at<uchar>(i,j)=128; //将第 i 行第 j 列像素值设置为 128
    

    对图像进行遍历,分别对单通道的 grayim 以及 3 个通道的 colorim,然后对两个图像的所有像素值
    进行赋值,最后现实结果

    Mat grayim(600, 800, CV_8UC1);
     Mat colorim(600, 800, CV_8UC3);
     //遍历所有像素,并设置像素值
     for( int i = 0; i < grayim.rows; ++i)
     for( int j = 0; j < grayim.cols; ++j )
     grayim.at<uchar>(i,j) = (i+j)%255;
     //遍历所有像素,并设置像素值
     for( int i = 0; i < colorim.rows; ++i)
     for( int j = 0; j < colorim.cols; ++j )
     {
     Vec3b pixel;
     pixel[0] = i%255; //Blue
     pixel[1] = j%255; //Green
     pixel[2] = 0; //Red
     colorim.at<Vec3b>(i,j) = pixel;
     }
     //显示结果
     imshow("grayim", grayim);
     imshow("colorim", colorim);
     waitKey(0);
    

    使用迭代器遍历:

    Mat grayim(600, 800, CV_8UC1);
     Mat colorim(600, 800, CV_8UC3);
     //遍历所有像素,并设置像素值
     MatIterator_<uchar> grayit, grayend;
     for( grayit = grayim.begin<uchar>(), grayend =
    grayim.end<uchar>(); grayit != grayend; ++grayit)
     *grayit = rand()%255;
     //遍历所有像素,并设置像素值
     MatIterator_<Vec3b> colorit, colorend;
     for( colorit = colorim.begin<Vec3b>(), colorend =
    colorim.end<Vec3b>(); colorit != colorend; ++colorit)
     {
     (*colorit)[0] = rand()%255; //Blue
     (*colorit)[1] = rand()%255; //Green
     (*colorit)[2] = rand()%255; //Red
     }
     //显示结果
    

    采用指针:

    Mat grayim(600, 800, CV_8UC1);
     Mat colorim(600, 800, CV_8UC3);
     //遍历所有像素,并设置像素值
     for( int i = 0; i < grayim.rows; ++i)
     {
     //获取第 i 行首像素指针
     uchar * p = grayim.ptr<uchar>(i);
     //对第 i 行的每个像素(byte)操作
     for( int j = 0; j < grayim.cols; ++j )
     p[j] = (i+j)%255;
     }
     //遍历所有像素,并设置像素值
     for( int i = 0; i < colorim.rows; ++i)
     {
     //获取第 i 行首像素指针
     Vec3b * p = colorim.ptr<Vec3b>(i);
     for( int j = 0; j < colorim.cols; ++j )
     {
     p[j][0] = i%255; //Blue
     p[j][1] = j%255; //Green
     p[j][2] = 0; //Red
     }
     }
     //显示结果
    
  • 相关阅读:
    Android异步操作总结
    datatable1.9 与datatable1.10以数据差异
    ftk学习记录(形成全屏幕套件)
    linux处置服务Iptables
    Linux课程---9、安装RPM包(RPM的全称是什么)
    Linux课程---8、Linux启动流程
    Linux课程---7、shell技巧(获取帮助命令)
    Linux课程---6、别名管理和网络配置(Linux命令如何记)
    Linux课程---5、常用文件命令和目录命令(创建文件命令)
    英语发音规则---L字母
  • 原文地址:https://www.cnblogs.com/mysteryhjj/p/6542317.html
Copyright © 2011-2022 走看看