• opencv数据结构与基本绘图


    1 #include <opencv2corecore.hpp>//核心组件
    2 #include <opencv2opencv.hpp>//GUI,包含媒体输入输出,视频捕捉、图形交互界面的接口等
    3 #include <opencv2highguihighgui.hpp>//图像上处理
    4 using namespace std;
    5 using namespace cv;

    图像容器Mat

    不必再手动开辟空间;

    不必再不需要时立即将空间释放。

    Mat是一个类,有两个数据部分组成:矩阵头(矩阵尺寸,存储方法、存储地址等)和一个指向存储所有像素值得矩阵的指针。

    opencv使用了引用计数机制,每个Mat对象有自己的信息头,共享一个矩阵。这通过让矩阵指向同一地址而实现。

    拷贝构造函数值复制信息头和矩阵指针,不复制矩阵。

     1 #include <opencv2corecore.hpp>//核心组件
     2 #include <opencv2opencv.hpp>//GUI,包含媒体输入输出,视频捕捉、图形交互界面的接口等
     3 #include <opencv2highguihighgui.hpp>//图像上处理
     4 using namespace std;
     5 using namespace cv;
     6 
     7 int main(int argc, char** argv){//int argc, char* argv[]
     8     Mat A, C;//仅创建信息头部分
     9     A = imread("test.jpg");//为矩阵开辟内存空间
    10     Mat B(A);//使用拷贝构造函数
    11     C = A;//赋值运算符
    12 }

    创建ROI,只需要创建包含边界信息的信息头:

    1 Mat D(A, Rect(10, 10, 100, 100));//使用矩形界定
    2 Mat E = A(Range::all(), Range(1, 3));//使用行和列界定

    复制矩阵本身,使用clone()函数或copyTo函数:

    Mat F = A.clone();
    Mat G;
    A.copyTo(G);

    创建Mat对象

    Mat运算符<<只对二维矩阵有效。

    方法一:Mat()构造函数

    Mat M(2, 2, CV_8UC3, Scalar(0, 0, 255));
    cout << "M=" << endl << M << endl;

    (1)2行2列;

    (2)存储元素的数据类型及每个矩阵点的通道数;CV_8UC3表示使用8位的unsigned char型,每个像素由三个元素组成三通道。预先定义的通道数可以多达四个。

    CV_[位数][带符号与否][类型前缀]C[通道数],大部分设备都是用无符号8位整数CV_8U表示像素亮度。

    如果需要更多通道数,可以把通道数放在小括号内,如:Mat M(3,2,CV_8UC(5)),通道数为5

    (3)Scalar是个short型向量,指定值初始化矩阵,还可以用于表示颜色。

    BGR:(0,0,255)表示全红

    输出:

    方法二:在CC++中通过构造函数进行初始化

    1 int main(int argc, char** argv){//int argc, char* argv[]
    2     int sz[3] = { 2, 2, 2 };//每个维度的尺寸
    3     Mat L(3, sz, CV_8UC, Scalar::all(0));
    4     system("PAUSE");
    5     return EXIT_SUCCESS;
    6 }

     方法三:为已存在的IPlIMAGE指针创建信息头

    1 IPlImage* img = cvLoadImage("1.jpg",1);
    2 Mat mtx(img);//转换IPlImage* -> Mat

    方法四:Create()函数

    1 M.create(4,4,CV_8UC(2));

    若create函数指定的参数与之前的参数相同,则不进行实质的内存申请,否则就申请。

    方法五:Matlab形式

    1 Mat E = Mat::eye(4,4,CV_64F);//单位阵
    2 Mat O = Mat::ones(2,2,CV_32F);//全1矩阵
    3 Mat Z = Mat::zeros(3,3CV_8UC1);//0矩阵

    方法六:对小矩阵使用逗号分隔式初始化函数

    1 Mat C = (Mat_<double>(3,3) << 0,-1,0,-1,5,-1,0,-1,0);
    2 cout << C << endl;

    方法七:为已存在的对象创新信息头

    clone函数和copyTo函数。

    1 int main(int argc, char** argv){//int argc, char* argv[]
    2     Mat C = (Mat_<double>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
    3     Mat rowclone = C.row(1).clone();//把C的第一行赋值给了rowclone这个新的
    4     system("PAUSE");
    5     return EXIT_SUCCESS;
    6 }

    格式化输出方法

    Mat r = Mat(10,3,CV_8UC3);
    randu(r,Scalar::all(0), Scalar::all(255));//randu产生随机值填充矩阵,给定上下限
    
    cout << r << endl;//opencv默认风格
    
    cout << foramt(r,Formatter::FMT_PYTHON) << endl;//python
    
    cout << format(r,Formatter::FMT_CSV) << endl;//逗号分隔风格
    
    cout << format(r,Formatter::FMT_NUMPY) << endl;//numpy风格
    
    cout << format(r,Formatter::FMT_FMT_C) << endl;//c风格

    常用数据结构

    点:Point类

    1 Point point;
    2 point.x = 10;
    3 point.y = 6;
    4 
    5 //方法二
    6 Point point = Point(10,6);

    Point_<int> == Point2i == Point

    Point_<float> == Point2f

    颜色表示:Scalar类

    Scalar表示具有4个元素的数组,BGR,如果用不到第四个参数,就不需要写出来。

    Scalar(a,b,c)

    尺寸:Size类

    Size(width, height);

    矩形:Rect类

    Rect rect = Rect(x,y,width,height);//左上角点坐标,宽,高
    
    rect.Size();//返回size
    rect.area();//返回矩形面积
    rect.contains(Point);//判断点是否在矩形内
    rect.inside(Rect);//判断矩形是否在该矩形内
    
    Rect newrect1 = rect1 & rect2;//交集
    Rect newrect2 = rect1 | rect2;//并集
    
    Rect newrect3 = rect + point;//平移操作
    Rect newrect4 = rect + size;//放缩操作

    颜色空间转换:cvtColor函数

    void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0);

    (1)输入图像;

    (2)输出图像

    (3)颜色空间转换标识符;

    (4)目标图像通道数,默认值0,0表示目标图像取源图像的通道数;

    opencv3中的COLOR_式的宏命名前缀取代了opencv2的CV_。

  • 相关阅读:
    The Hungarian algorithm Template
    用二进制方法求两个整数的最大公约数(GCD)
    <climits>头文件使用方法
    开大Stack的一个小技巧
    2014 HDU多校弟五场J题 【矩阵乘积】
    2014 HDU多校弟五场A题 【归并排序求逆序对】
    POJ 2449 求第K短路
    UVALive 6467 Strahler Order 拓扑排序
    POJ 1041 John's trip 无向图的【欧拉回路】路径输出
    Ural 1450 求最长路 SPFA
  • 原文地址:https://www.cnblogs.com/pacino12134/p/10980049.html
Copyright © 2020-2023  润新知