OpenCV的下载安装及简单的Mat结构介绍
2015-05-12 10:12
309 查看
一:OPenCV下载及配置
1:在OpenCV官网下载OpenCV,我是解压到D:\Program Files\下
2:在VS2012中配置OpenCV
(1)首先,建一个空项目,主函数为main.cpp
(2)要想通用的配置,以后新建的工程不用再额外的进行重新配置,则可进行如下操作:【视图】 -> 【属性管理器】
(3)在新出现的“属性管理器”工作区中,点击项目->Debug|Win32->Main.Cpp.Win32.user(右键属性,或者双击)即可打开属性页面,打开属性页面后,就可以进行一番配置
(4)【通用属性】
->【VC++目录】 ->【包含目录】中 添加上
D:\Program Files\opencv\build\include
D:\Program Files\opencv\build\include\opencv
D:\Program Files\opencv\build\include\opencv2
这三个目录。
(5)【通用属性】 ->【VC++目录】 ->【库目录】中 添加上 (lib目录)
D:\Program Files\opencv\build\x86\vc11\lib
(6)【通用属性】 ->【链接器】->【输入】->【附加的依赖项】中 添加 (链接库)
D:\Program Files\opencv\build\x86\vc11\lib中所有lib库文件的名字,其中,带d的为Debug文件库名,不带d的为Release文件库名。例如,
OpenCV 2.4.9:
opencv_ml249d.lib
opencv_calib3d249d.lib
opencv_contrib249d.lib
opencv_core249d.lib
opencv_features2d249d.lib
opencv_flann249d.lib
opencv_gpu249d.lib
opencv_highgui249d.lib
opencv_imgproc249d.lib
opencv_legacy249d.lib
opencv_objdetect249d.lib
opencv_ts249d.lib
opencv_video249d.lib
opencv_nonfree249d.lib
opencv_ocl249d.lib
opencv_photo249d.lib
opencv_stitching249d.lib
opencv_superres249d.lib
opencv_videostab249d.lib
opencv_objdetect249.lib
opencv_ts249.lib
opencv_video249.lib
opencv_nonfree249.lib
opencv_ocl249.lib
opencv_photo249.lib
opencv_stitching249.lib
opencv_superres249.lib
opencv_videostab249.lib
opencv_calib3d249.lib
opencv_contrib249.lib
opencv_core249.lib
opencv_features2d249.lib
opencv_flann249.lib
opencv_gpu249.lib
opencv_highgui249.lib
opencv_imgproc249.lib
opencv_legacy249.lib
opencv_ml249.lib
3:环境变量配置
【计算机】->【(右键)属性】->【高级系统设置】->【高级(标签)】->【环境变量】->“双击”系统变量中的PATH->在变量值里面添加相应的路径:
D:\Program Files\opencv\build\x64\vc10\bin;D:\Program Files\opencv\build\x86\vc10\bin
配置完之后一般需要重新启动一下。
二:简单的Mat结构介绍
1:Mat基础
在OpenCV2中,数据结构Mat是保存图像像素信息的矩阵,它主要包含两部分:矩阵头和一个指向像素数据的矩阵指针。
矩阵头主要包含:矩阵尺寸、存储方法、存储地址和引用次数等,它的大小是一个常数,不会随着图像的大小而改变。
而保存图像像素数据的矩阵则会随着图像的大小而改变,通常数据量会很大,比矩阵头大几个数量级。这样,在图像复制和传递过程中,主要的开销是由存放图像像素的矩阵而引起的。因此,OpenCV使用了引用次数,当进行图像复制和传递时,不再复制整个Mat数据,而只是复制矩阵头和指向像素矩阵的指针。例如:
上面的a,b有各自的矩阵头,但是其矩阵指针指向同一个矩阵,也就是其中任何一个改变了矩阵数据都会影响另外一个。那么,多个Mat共用一个矩阵数据,最后谁来释放矩阵数据呢?
这就是引用计数的作用,当Mat对象每被复制一次时,就会将引用计数加1,而每销毁一个Mat对象(共用同一个矩阵数据)时引用计数会被减1,当引用计数为0时,矩阵数据会被清理。
上图是Mat对象a,b共用一个矩阵,故其引用计数refcount为2.
但是有些时候仍然会需要复制矩阵数据本身(不只是矩阵头和矩阵指针),这时候可以使用clone 和copyTo方法。
上面代码中的c,d各自拥有自己的矩阵,改变自己的矩阵数据不会相互影响。
在使用Mat中,需要记住:
OpenCV中的内存分配是自动完成的(不是特别指定的话)
使用OpenCV的C++ 接口时不需要考虑内存释放问题
Mat的赋值运算和拷贝构造函数只会拷贝矩阵头,仍然共同同一个矩阵
如果要复制矩阵数据,可以使用clone和copyTo函数
2:Mat存储方法
(1)构造函数
上述代码创建了一个2行2列的矩阵,矩阵元素使用8位无符号char类型保存,具有3通道,每个像素的初始值是(0,0,255)
构造函数的前两个参数指定了矩阵的行和列
第三个参数指定矩阵元素的数据类型以及通道数,其指定规则如下:
四部分分别指定:元素的大小,是有符号还是无符号,数据类型以及通道数
最后一个参数,Scalar是short型的vector,提供矩阵的初始化。
(2)Mat的输入输出
使用imread函数,向Mat对象中写入一个图像。
imread的原型如下
filename指定要读取图像的位置
flags指定图像的颜色空间
flags > 0 3通道的彩色图像
flags = 0 灰度图像
flags < 0 不作改变
也可以有以下的枚举值
CV_LOAD_IMAGE_ANYDEPTH、CV_LOAD_IMAGE_COLOR、CV_LOAD_IMAGE_GRAYSCALE
使用imwrite函数,将Mat对象保存到指定的文件中。
imwrite的函数原型如下:
filename,指定的文件
img 要保存的Mat对象
params 用来指定图像的保存编码方式。
使用filename的扩展名来指定图像的保存格式(.jpg .png .bmp),对于不同的图像保存类型,params是不同的值
JPEG,params用来指定图像的质量(0到100),默认的是95. CV_IMWRITE_JPEG_QUALITY
PNG,params用来指定图像的压缩级别(0到9),压缩级别越高图像占用的空间越小,保存图像所用的时间越久。默认值是3. CV_IMWRITE_PNG_COMPRESSION
PPM,PGM,PBM,params是一个标记(0或者1),默认的是1.CV_IMWRITE_PXM_BINARY
imwrite只能保存8位(或者是16位无符号(CV_16UC)的PNG,JPEG200或者TIFF图像)单通道或者三通道的图像,如果要保存的不是这样的图片,可以使用convertTo或者cvtColor来进行转变。
参考地址: http://www.cnblogs.com/wangguchangqing/p/3841271.html http://blog.csdn.net/poem_qianmo/article/details/19809337
1:在OpenCV官网下载OpenCV,我是解压到D:\Program Files\下
2:在VS2012中配置OpenCV
(1)首先,建一个空项目,主函数为main.cpp
(2)要想通用的配置,以后新建的工程不用再额外的进行重新配置,则可进行如下操作:【视图】 -> 【属性管理器】
(3)在新出现的“属性管理器”工作区中,点击项目->Debug|Win32->Main.Cpp.Win32.user(右键属性,或者双击)即可打开属性页面,打开属性页面后,就可以进行一番配置
(4)【通用属性】
->【VC++目录】 ->【包含目录】中 添加上
D:\Program Files\opencv\build\include
D:\Program Files\opencv\build\include\opencv
D:\Program Files\opencv\build\include\opencv2
这三个目录。
(5)【通用属性】 ->【VC++目录】 ->【库目录】中 添加上 (lib目录)
D:\Program Files\opencv\build\x86\vc11\lib
(6)【通用属性】 ->【链接器】->【输入】->【附加的依赖项】中 添加 (链接库)
D:\Program Files\opencv\build\x86\vc11\lib中所有lib库文件的名字,其中,带d的为Debug文件库名,不带d的为Release文件库名。例如,
OpenCV 2.4.9:
opencv_ml249d.lib
opencv_calib3d249d.lib
opencv_contrib249d.lib
opencv_core249d.lib
opencv_features2d249d.lib
opencv_flann249d.lib
opencv_gpu249d.lib
opencv_highgui249d.lib
opencv_imgproc249d.lib
opencv_legacy249d.lib
opencv_objdetect249d.lib
opencv_ts249d.lib
opencv_video249d.lib
opencv_nonfree249d.lib
opencv_ocl249d.lib
opencv_photo249d.lib
opencv_stitching249d.lib
opencv_superres249d.lib
opencv_videostab249d.lib
opencv_objdetect249.lib
opencv_ts249.lib
opencv_video249.lib
opencv_nonfree249.lib
opencv_ocl249.lib
opencv_photo249.lib
opencv_stitching249.lib
opencv_superres249.lib
opencv_videostab249.lib
opencv_calib3d249.lib
opencv_contrib249.lib
opencv_core249.lib
opencv_features2d249.lib
opencv_flann249.lib
opencv_gpu249.lib
opencv_highgui249.lib
opencv_imgproc249.lib
opencv_legacy249.lib
opencv_ml249.lib
3:环境变量配置
【计算机】->【(右键)属性】->【高级系统设置】->【高级(标签)】->【环境变量】->“双击”系统变量中的PATH->在变量值里面添加相应的路径:
D:\Program Files\opencv\build\x64\vc10\bin;D:\Program Files\opencv\build\x86\vc10\bin
配置完之后一般需要重新启动一下。
二:简单的Mat结构介绍
1:Mat基础
在OpenCV2中,数据结构Mat是保存图像像素信息的矩阵,它主要包含两部分:矩阵头和一个指向像素数据的矩阵指针。
矩阵头主要包含:矩阵尺寸、存储方法、存储地址和引用次数等,它的大小是一个常数,不会随着图像的大小而改变。
而保存图像像素数据的矩阵则会随着图像的大小而改变,通常数据量会很大,比矩阵头大几个数量级。这样,在图像复制和传递过程中,主要的开销是由存放图像像素的矩阵而引起的。因此,OpenCV使用了引用次数,当进行图像复制和传递时,不再复制整个Mat数据,而只是复制矩阵头和指向像素矩阵的指针。例如:
上面的a,b有各自的矩阵头,但是其矩阵指针指向同一个矩阵,也就是其中任何一个改变了矩阵数据都会影响另外一个。那么,多个Mat共用一个矩阵数据,最后谁来释放矩阵数据呢?
这就是引用计数的作用,当Mat对象每被复制一次时,就会将引用计数加1,而每销毁一个Mat对象(共用同一个矩阵数据)时引用计数会被减1,当引用计数为0时,矩阵数据会被清理。
上图是Mat对象a,b共用一个矩阵,故其引用计数refcount为2.
但是有些时候仍然会需要复制矩阵数据本身(不只是矩阵头和矩阵指针),这时候可以使用clone 和copyTo方法。
cv::Mat c = a.clone(); cv::Mat d ; a.copyTo(d);
上面代码中的c,d各自拥有自己的矩阵,改变自己的矩阵数据不会相互影响。
在使用Mat中,需要记住:
OpenCV中的内存分配是自动完成的(不是特别指定的话)
使用OpenCV的C++ 接口时不需要考虑内存释放问题
Mat的赋值运算和拷贝构造函数只会拷贝矩阵头,仍然共同同一个矩阵
如果要复制矩阵数据,可以使用clone和copyTo函数
2:Mat存储方法
(1)构造函数
cv::Mat img(2,2,CV_8UC3,cv::Scalar(0,0,255));
上述代码创建了一个2行2列的矩阵,矩阵元素使用8位无符号char类型保存,具有3通道,每个像素的初始值是(0,0,255)
构造函数的前两个参数指定了矩阵的行和列
第三个参数指定矩阵元素的数据类型以及通道数,其指定规则如下:
CV_[The number of bits per item][Signed or Unsigned][TypePrefix]C[The channel number]
四部分分别指定:元素的大小,是有符号还是无符号,数据类型以及通道数
最后一个参数,Scalar是short型的vector,提供矩阵的初始化。
(2)Mat的输入输出
使用imread函数,向Mat对象中写入一个图像。
a = cv::imread("f:\\psb.jpg");//读入图像
imread的原型如下
cv::Mat imread(const string& filename,int flags=1)
filename指定要读取图像的位置
flags指定图像的颜色空间
flags > 0 3通道的彩色图像
flags = 0 灰度图像
flags < 0 不作改变
也可以有以下的枚举值
CV_LOAD_IMAGE_ANYDEPTH、CV_LOAD_IMAGE_COLOR、CV_LOAD_IMAGE_GRAYSCALE
使用imwrite函数,将Mat对象保存到指定的文件中。
imwrite的函数原型如下:
bool imwrite(const string& filename,InputArray img,constvector<int>& params=vector<int>())
filename,指定的文件
img 要保存的Mat对象
params 用来指定图像的保存编码方式。
使用filename的扩展名来指定图像的保存格式(.jpg .png .bmp),对于不同的图像保存类型,params是不同的值
JPEG,params用来指定图像的质量(0到100),默认的是95. CV_IMWRITE_JPEG_QUALITY
PNG,params用来指定图像的压缩级别(0到9),压缩级别越高图像占用的空间越小,保存图像所用的时间越久。默认值是3. CV_IMWRITE_PNG_COMPRESSION
PPM,PGM,PBM,params是一个标记(0或者1),默认的是1.CV_IMWRITE_PXM_BINARY
imwrite只能保存8位(或者是16位无符号(CV_16UC)的PNG,JPEG200或者TIFF图像)单通道或者三通道的图像,如果要保存的不是这样的图片,可以使用convertTo或者cvtColor来进行转变。
3.Mat的显示
OpenCV提供了用以窗口的形式显示图片的方法,代码如下:#include<iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> using namespace cv; int main() { // 读入一张图片(游戏原画) Mat img=imread("F:\\下载.jpg"); // 创建一个名为 "游戏原画"窗口 namedWindow("游戏原画"); // 在窗口中显示游戏原画 imshow("游戏原画",img); // 等待6000 ms后窗口自动关闭 waitKey(); }
参考地址: http://www.cnblogs.com/wangguchangqing/p/3841271.html http://blog.csdn.net/poem_qianmo/article/details/19809337
相关文章推荐
- openstack单机ubuntu虚拟机环境安装部署经验及源码结构简单介绍(适合入门者)
- openstack单机ubuntu虚拟机环境安装部署经验及源码结构简单介绍(适合入门者)
- 03--MySQL自学教程:MySQL安装后的目录结构介绍和简单语法指令
- 03--MySQL自学教程:MySQL安装后的目录结构介绍和简单语法指令
- Wireshark 工具下载安装和简单实例操作
- 第一节 MongoDB介绍及下载与安装(推荐--arvin很不错)
- IAR for STM8介绍、下载、安装与注册
- iOS开发——多线程篇——快速生成沙盒目录的路径,多图片下载的原理、SDWebImage框架的简单介绍
- 深入浅出JMS(二)--ActiveMQ简单介绍以及安装
- STM32CubeMX开发(一)--介绍、下载与安装
- ActiveMQ简单介绍以及安装
- 【Tomcat】tomcat简单介绍,安装以及启动(一)
- ASP-kingCMS-v5.1 LTS使用(一)下载,安装,简单设置
- redis 下载 安装 主从简单配置
- OpenCV2:Mat介绍及常见用法
- 学习使用Robot Framework自动化测试框架(一)——简单介绍与安装方法
- opencv2.x新数据结构cv::Mat访问元素的方法
- 还为安装IIS发愁吗?全系列IIS自动安装程序倾囊奉送!--技术原理介绍及成品下载
- opencv Mat 数据结构与使用技巧
- 微软最新的 Web 开发工具WebMatrix的简单介绍及安装