01 邂逅Opencv

来源:互联网 发布:安徽省癌症数据 编辑:程序博客网 时间:2024/06/16 08:21

OpenCV:Open Source Computer Vision Library<开源计算机视觉库>

首先在上一节安装好了,然后用一个测试文件(上节00有代码),可以正常的运行。

      然后还不要着急去学习怎么图像处理,因为还要知道一些常识。

     准备知识也是很重要

  1.      模块
  2.      #include
  3.      namespace
  4.      argc argv
  5.      Mat

(1) 模块

          在这个文件下D:\ProgramFiles\OpenCV\build\include\opencv2会看到很多东西,这些都是需要的模块(注:也可以在opencv2\opencv_modules.hpp看到),里面有很多的要用的东西

                                       

       介绍这个就不说了

       因为是图像处理,先不用管那么多的模块,先去认识core imgproc  highgui这三个,其他的用到的时候再去看吧

       为 什么要看这个三个呢?

一、Core 核心功能模块(核心所以必须要啊),主要包含opencv基本数据结构,动态数据结构,绘图函数,数组操作相关函数,听听这些名字就知道必须要用了


二、Imgproc 这是图像处理模块,既然是处理图像,那也是没的说了


三、Highgui GUI图形用户界面,简单的说,你要用窗口,用界面,什么输入输出了,那你就用他的模块了


 (2)#include

           正如你经常看到的,每个代码的前面都会有这养的include,包含才可用,学过c++的应该很懂

#include <opencv2/core/core.hpp> 

#include<opencv2/highgui/highgui.hpp> 


   (3) namespace

          还有一个需要注意的是这样的话

[plain] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. using namespace cv;  
[plain] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. using namespace std;  

        因为OpenCV中的C++类和函数都是定义在命名空间cv之内的,想要用,就的提前给人家打声招呼,所以要加上using namespacecv;这个方法比较好,只要一句话就可以,但是如果你加这一句,那么后面如果你要用类和函数的话,你就的这样写,很麻烦,std同理,std是一个类(输入输出标准),它包括了cin成员和cout成员,usingname space std ;以后才能使用它的成员。

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. image=cv::imread(“lena.jpg”)  
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. cv::nameWindow(“original image”);  
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. cv::imshow(“original image”,image)  
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1.   

   (4) argc argv

对于一个程序来说,都会有一个main()函数

例如我们常用的一句话 

 main(int argv char **argv)

         这里的int argc 为整型,用来统计程序运行时,发送给main函数的命令行参数;char **argv 是字符串数组用来存放指向字符串参数的指针数组,每一个元素指向一个参数

imread(argv[1],1),//意思是读取字符串名为argv[1]的图片,argv[1]指向在DOS命令行中执行程序名后的第一个字符串


(5)Mat

       自从版本2.0,OpenCV采用了新的数据结构,用Mat类结构取代了之前用extended C写的cvMat和lplImage(在学习代码的时候,会经常看到IplImage),更加好用啦,最大的好处就是更加方便的进行内存管理,对写更大的程序是很好的消息。

        如果光说Mat其中就可以是一篇很长的文章,因为用法太多,Mat是OpenCV里最基本的一个类,它用来表示图像,有部分组成,一个是矩阵头,一个是指向存储所有像素值的矩阵的指针,其中幅值与复制只是复制了信息头。下面给出超具体的例子,可以慢慢体会每一个Mat的应用,还有以前一篇写的复制问题可以参考http://blog.csdn.net/qq_20823641/article/details/51452939
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include <opencv2/core/core.hpp>    
  2. #include <opencv2/highgui/highgui.hpp>    
  3. #include <cv.h>    
  4. #include <iostream>    
  5.     
  6. using namespace std;    
  7. using namespace cv;    
  8.     
  9. int main()    
  10. {    
  11.         
  12.         //Mat() Constructor    
  13.         Mat M(2,2,CV_8UC3,Scalar(0,0,255));    
  14.         cout<<"M = "<<endl<<" "<<M<<endl<<endl;    
  15.         
  16.         //C/C++ arrays and initialize via constructor    
  17.         int sz[3]={2,2,2};//创建一个三维矩阵    
  18.         Mat L(3,sz,CV_8UC1,Scalar::all(0));    
  19.         //cout<<"L = "<<endl<<" "<<L<<endl<<endl;    
  20.     
  21.     
  22.         //create a header for an already existing IplImage pointer    
  23.         IplImage* img = cvLoadImage("D:\\lena.bmp",1);    
  24.         Mat mtx(img);//把IplImage*转换为Mat    
  25.         
  26.         //create()函数    
  27.         M.create(4,4,CV_8UC(2));    
  28.         cout<<"M = "<<endl<<" "<<M<<endl<<endl;    
  29.         
  30.         //MATLAB风格初始化:zero(),ones(),:eyes().    
  31.         Mat E = Mat::eye(4,4,CV_64F);    
  32.         cout<<"E = "<<endl<<" "<<E<<endl<<endl;    
  33.         Mat O = Mat::ones(2,2,CV_32F);    
  34.         cout<<"O = "<<endl<<" "<<O<<endl<<endl;    
  35.         Mat Z = Mat::zeros(3,3,CV_8UC1);    
  36.         cout<<"Z = "<<endl<<" "<<Z<<endl<<endl;    
  37.         
  38.         //小矩阵用逗号初始化    
  39.         Mat C = ( Mat_<double>(3,3)<< 0,-1,0,-1,5,-1,0,-1,0);    
  40.         cout<<"C = "<<endl<<" "<<C<<endl<<endl;    
  41.     
  42.     
  43.         //对已经存在的Mat对象创建新的头,并克隆或复制    
  44.         Mat RowClone = C.row(1).clone();    
  45.         cout<<"RowClone = "<<endl<<" "<<RowClone<<endl<<endl;    
  46.         
  47.         //利用随机函数创建Mat矩阵    
  48.         Mat R = Mat(3,2,CV_8UC3);    
  49.         randu(R,Scalar::all(0),Scalar::all(255));    
  50.         cout<<"R = "<<endl<<" "<<R<<endl<<endl;    
  51.         
  52.         //打印输出格式化    
  53.         //default格式    
  54.         cout<<"R(default) = "<<endl<<R<<endl<<endl;    
  55.         //Python格式    
  56.         cout<<"R(Python) = "<<endl<<format(R,"python")<<endl<<endl;    
  57.         //comma separated values(CSV)    
  58.         cout<<"R(csv) = "<<endl<<format(R,"csv")<<endl<<endl;    
  59.         //numpy    
  60.         cout<<"R(numpy) = "<<endl<<format(R,"numpy")<<endl<<endl;    
  61.         //C    
  62.         cout<<"R(c) = "<<endl<<format(R,"C")<<endl<<endl;    
  63.     
  64.         //2D Point    
  65.         Point2f p(5,1);    
  66.         cout<<"Point(2D) = "<<p<<endl<<endl;    
  67.         //3D Point    
  68.         Point3f P3f(2,6,7);    
  69.         cout<<"Point (3D) = "<<P3f<<endl<<endl;    
  70.         //std::vector via cv::Mat    
  71.         vector<float> v;    
  72.         v.push_back((float)CV_PI);    
  73.         v.push_back(2);    
  74.         v.push_back(3.01f);    
  75.         cout<<"Vector of floats via Mat = "<<Mat(v)<<endl<<endl;    
  76.         //std::vector of points    
  77.         vector<Point2f> vPoints(20);    
  78.         for(size_t E=0;E<vPoints.size();++E)    
  79.         vPoints[E] = Point2f((float)(E*5),(float)(E%7));    
  80.         cout<<"A Vector of 2D POINTS = "<<vPoints<<endl<<endl;    
  81.         return 0;    
  82. }    

                      

 除此之外呢,Mat类还有很多的属性,方便我们理解图像矩阵,例如高度、宽度等

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. Mat img(3, 4, CV_16UC4, Scalar_<uchar>(1, 2, 3, 4));  
  2.       
  3.     cout <<"img is:"<< img << endl;  
  4.   
  5.     cout << "dims:" << img.dims << endl;  
  6.     cout << "rows:" << img.rows << endl;  
  7.     cout << "cols:" << img.cols << endl;  
  8.     cout << "channels:" << img.channels() << endl;  
  9.     cout << "type:" << img.type() << endl;  
  10.     cout << "depth:" << img.depth() << endl;  
  11.     cout << "elemSize:" << img.elemSize() << endl;  
  12.     cout << "elemSize1:" << img.elemSize1() << endl;  


部分内容转自:http://blog.csdn.net/qq_20823641/article/details/51879160

0 0