opencv 2 Opencv数据结构与基本绘图

基础图像容器Mat

Mat 是一个类,又两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法不同,矩阵可以是不同的维数)的指针。矩阵头的尺寸是常数值,但矩阵本身的尺寸会依图像的不同而不同,通常会比矩阵头的尺寸大数个数量级。
1589120-20190710081848390-1566180745.png
1589120-20190710082104728-2022926301.png
1589120-20190710082148568-1000705673.png

像素值的存储方法

RGB颜色空间是最常用的一种颜色空间,这归功于它也是人眼内部构成颜色的方式。它的基色是红色、绿色和l蓝色,有时为了表示透明颜色也会加入第四个元素alpha(A) 。
1589120-20190710082424448-1261816895.png

显式创建Mat对象的七种方法

方法一 使用Mat()构造函数

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

1589120-20190710084058184-1567956355.png

1589120-20190710084102117-896948118.png

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

int sz[3] = { 2,2,2 };
    Mat L(3, sz,  CV_8UC3 , Scalar::all(0));

上面的例子演示了如何创建一个超过两维的矩阵:指定维数,然后传递一个指向一个数组的指针,这个数组包含每个维度的尺寸;后续的两个参数与方法一中的相同。

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

//方法已过期

方法四利用Create()函数

        Mat M;
    M.create(4, 4, CV_8UC(2));
    cout << "M=" << endl << " " << M << endl << endl;
    waitKey(0);
    return 0;

需要注意的是,此创建方法不能为矩阵设初值,只是在改变尺寸时重新为矩阵数据开辟内存而己。

方法五 采用Matlab形式的初始化方式

万法五采用 Matlab形式的初始化方式:zeros().,ones(), eyes()。使用以下方法指定尺寸和数据类型:

    Mat Z = Mat::zeros(3, 3, CV_8UC1);
    cout << "Z=" << endl << " " << Z << endl << endl;

        /*Mat E = Mat::eye(4, 4, CV_64F);
    cout << "E=" << endl << " " << E << endl << endl;*/

    /*Mat O = Mat::ones(2, 2, CV_32F);
    cout << "O=" << endl << " " << O << endl << endl;*/

1589120-20190710101021654-1352138042.png

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

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

1589120-20190710101442727-746892242.png

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

Mat C = imread("G:\\666.jpg");
    Mat RowClone = C.row(1).clone();
    cout << "RowClone=" << endl << " " << RowClone << endl << endl;

Opencv中的格式化输出方法

1589120-20190710152031722-1362115691.png

1589120-20190710134000347-478218084.png
1589120-20190710134026449-2088730625.png
1589120-20190710134043236-571998759.png
1589120-20190710134108881-505256937.png
1589120-20190710134122808-112046031.png

输出其他数据结构

1589120-20190710135210618-670798580.png
1589120-20190710135224390-1846787056.png
1589120-20190710135239946-2002008954.png

示例程序




//---------------------------------【头文件、命名空间包含部分】---------------------------
//          描述:包含程序所使用的头文件和命名空间
//-----------------------------------------------------------------------------------------------
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
using namespace std;
using namespace cv;



//-----------------------------【ShowHelpText( )函数】--------------------------------------
//      描述:输出帮助信息
//-------------------------------------------------------------------------------------------------
static void ShowHelpText()
{
    
    printf("\n\n\t\t\t   当前使用的OpenCV版本为:" CV_VERSION );
    printf("\n\n  ----------------------------------------------------------------------------\n");

    //输出一些帮助信息
    printf("\n\n\n\t欢迎来到【基本图像容器-Mat类】示例程序~\n\n");   
    printf("\n\n\t程序说明:\n\n\t此示例程序用于演示Mat类的格式化输出功能,输出风格可为:");
    printf("\n\n\n\t【1】OpenCV默认风格");
    printf("\n\n\t【2】Python风格");
    printf("\n\n\t【3】逗号分隔风格");
    printf("\n\n\t【4】Numpy风格");
    printf("\n\n\t【5】C语言风格\n\n");
    printf("\n  --------------------------------------------------------------------------\n");



}


//--------------------------------------【main( )函数】-----------------------------------------
//          描述:控制台应用程序的入口函数,我们的程序从这里开始执行
//-----------------------------------------------------------------------------------------------
int main(int,char**)
{
    //改变控制台的前景色和背景色
    system("color 8F"); 

    //显示帮助文字
    ShowHelpText();

    Mat I = Mat::eye(4, 4, CV_64F);
    I.at<double>(1,1) = CV_PI;
    cout << "\nI = " << I << ";\n" << endl;

    Mat r = Mat(10, 3, CV_8UC3);
    randu(r, Scalar::all(0), Scalar::all(255));

    //此段代码的OpenCV2版为:
    //cout << "r (OpenCV默认风格) = " << r << ";" << endl << endl;
    //cout << "r (Python风格) = " << format(r,"python") << ";" << endl << endl;
    //cout << "r (Numpy风格) = " << format(r,"numpy") << ";" << endl << endl;
    //cout << "r (逗号分隔风格) = " << format(r,"csv") << ";" << endl<< endl;
    //cout << "r (C语言风格) = " << format(r,"C") << ";" << endl << endl;
    //此段代码的OpenCV3版为:
    cout << "r (OpenCV默认风格) = " << r << ";" << endl << endl;
    cout << "r (Python风格) = " << format(r, Formatter::FMT_PYTHON) << ";" << endl << endl;
    cout << "r (Numpy风格) = " <<  format(r, Formatter::FMT_NUMPY )<< ";" << endl << endl;
    cout << "r (逗号分隔风格) = " << format(r, Formatter::FMT_CSV   )<< ";" << endl<< endl;
    cout << "r (C语言风格) = " <<  format(r, Formatter::FMT_C     ) << ";" << endl << endl;


    Point2f p(6, 2);
    cout << "【2维点】p = " << p << ";\n" << endl;

    Point3f p3f(8, 2, 0);
    cout << "【3维点】p3f = " << p3f << ";\n" << endl;

    vector<float> v;
    v.push_back(3);
    v.push_back(5);
    v.push_back(7);

    cout << "【基于Mat的vector】shortvec = " << Mat(v) << ";\n"<<endl;

    vector<Point2f> points(20);
    for (size_t i = 0; i < points.size(); ++i)
        points[i] = Point2f((float)(i * 5), (float)(i % 7));

    cout << "【二维点向量】points = " << points<<";";

    getchar();//按任意键退出

    return 0;


}

常用数据结构与函数

点的表示:Point类

Point point = Point(10, 8);
    
    /*或者
    Point point;
    point.x = 10;
    point.y = 8;
    */
注意:Point_,Point2i,Point互相等价,Point_,Point2f互相等价

颜色的表示:Scalar类

1589120-20190710165131644-1877018626.png

尺寸的表示:Size类

1589120-20190710190545419-805911282.png

矩阵的表示:Rect类

1589120-20190710165650794-368368620.png
1589120-20190710165719942-1567205633.png

颜色空间转换:cvtColor函数

1589120-20190710170242587-2030171696.png
1589120-20190710171256819-1845641412.png
1589120-20190710171338196-490552066.png
1589120-20190710171407757-932417297.png
1589120-20190710191434154-1077341567.png

1589120-20190710190943199-274820872.png

基本图形绘制

1589120-20190710184511634-1286676121.png
1589120-20190710185234203-114912103.png

1589120-20190710185212676-836055317.png
1589120-20190710185355496-1914979231.png

1589120-20190710185604575-700024175.png

1589120-20190710190059161-1564107805.png
1589120-20190710190116604-486169135.png
1589120-20190710190143052-1019081768.png
1589120-20190710190203143-1984399802.png

转载于:https://www.cnblogs.com/xingkongcanghai/p/11160592.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值