OpenCV学习笔记(三)—— OpenCV编程起点
来源:互联网 发布:qq视频播放器 mac 编辑:程序博客网 时间:2024/04/28 23:44
摘要:
由于最近AR(增强现实)这个概念非常火爆,各种基于AR的应用及游戏逐渐面向大众,而在AR中最重要的两个技术就是跟踪识别和增强渲染,其中跟踪识别是通过OpenCV这个开源的计算机视觉库来实现的,所以我就想着研究一下这个库,这里是个人的学习笔记,不是什么权威的教程,如果你们有错误也麻烦帮我指出哈。
=============================================分割线==================================================
前言:
用OpenCV来完成我们的功能之前,我们需要先了解几个关键的点:
1.OpenCV的命名空间
2.图片的载入、显示及输出
案例源码:
=====================================================================================================
#include <iostream>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>using namespace cv;int main(){// 读入一张图片(游戏原画) Mat img = imread("pic.jpg");// 创建一个名为 "游戏原画"窗口 namedWindow("游戏原画");// 在窗口中显示游戏原画 imshow("游戏原画", img);// 等待6000 ms后窗口自动关闭 waitKey(6000);}
====================================================================================================
一、OpenCV的命名空间:
在第一篇中我们引入了一个显示图片的案例,在头文件引入之后和main函数之前,我们可以看到这样一句声明:
using namespace cv;这就是命名空间的声明,在OpenCV中,C++类和函数都是定义在cv命名空间内的,所以假如我们需要在代码中引用OpenCV的时,需要声明其命名空间,方法有两个:
1.在main函数之后用“using namespace cv;”来声明命名空间
2.在要调用的类或者函数前面加上“cv::”来声明命名空间
显然,使用第一种方法的声明更加简洁方便。
二、图片载入、显示及输出:
1.图片载入:
我们要在窗口显示一张图片,首先我们需要将图片载入并转换成指定数据结构的数据存储,然后在需要显示的时候再将存储数据传递给显示接口,在案例中,我们载入图片的代码如下:
<span style="font-size:18px;"> // 读入一张图片(游戏原画) Mat img = imread("pic.jpg");</span>从以上代码我们发现,我们用imread函数载入pic.jpg这张图片之后,OpenCV中使用Mat类型来存储载入的图片数据,那么Mat类型有什么特点呢?
cv::Mat:是OpenCV用来保存图像以及其他矩阵数据的数据结构,其默认的尺寸为0,当然在定义是也可以指定其尺寸,例如我们在定义一个Mat对象时:cv::Matpic(640,1024,cv::Scalar(50));
imread函数:
官方原型:Mat imread(const string& filename, int flags=1 );
包含了两个参数:
参数一:const string&类型,用于填写图片存放的路径
参数二:int类型,载入标志,用于指定载入图片的颜色类型。显然这是一个枚举类型的,而且其缺省值为1,具体的枚举表可以在higui_c.h中找到。当然除了枚举也可以根据flag的赋值范围来判断颜色类型:
flags >0:返回一个3通道的彩色图像
- flags =0:返回灰度图像
- flags <0:返回包含Alpha通道的加载的图像
- (需要注意的点:输出的图像默认情况下是不载入Alpha通道进来的。如果我们需要载入Alpha通道的话呢,这里就需要取负值。)
2.图片显示:
显示图片,我们需要两个步骤:创建窗口和显示图片
namedWindow函数:
参数一:用于标识作用的,窗口的名称,不作为显示名称
参数二:int类型的窗口标识(跟窗口的大小有关)
imshow函数:
参数一:窗口的名称,作为显示名称
参数二:图片矩阵类型数据
3.图片输出:
在OpenCV中,我们通常用imwrite函数来输出图像到文件中,即
imwrite函数:
官方原型:bool imwrite(const string& filename,InputArray img, const vector<int>& params=vector<int>() );
参数一:输出之后的文件名,需要加上后缀
参数二:输出的一个图片Mat数据
参数三:特定格式保存的参数编码,具有默认值,一般不填
三、实例:
在这里,我们读取两张图片,然后合并图片信息,并输出合并后的图像到文件:
#include <iostream>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>using namespace cv;int main(){//载入图片Mat pic = imread("pic.jpg");//包含透明度Mat logo = imread("logo.jpg",-1);//分别显示两张图片namedWindow("原画【1】"); imshow("原画【1】", pic); namedWindow("原画【2】");imshow("原画【2】", logo);Mat imageROI = pic(Rect(800, 350, logo.cols, logo.rows));//将logo加到原图上addWeighted(imageROI, 0.5, logo, 0.3, 0., imageROI);//显示合并后的图片namedWindow("原画【3】");imshow("原画【3】", pic);//将混合之后的结果输出为新的图片imwrite("mix_pic.jpg",pic);//等待键盘任意按钮事件waitKey();return 0;}这里我们还用到了一个waitKey()函数,起作用就是让当前程序处于等待状态,保证绘制出来的窗口不会一闪而过,直到有键盘输入程序才继续运行。出现的结果是:
上面是混合之后的结果,我们还在程序中把混合之后的图像Mat数据通过imwrite方法输出为一张新的图片,查看工程目录,可以看到目录中多出了一张图片:
- OpenCV学习笔记(三)—— OpenCV编程起点
- OpenCV 学习笔记(三)
- opencv学习笔记(三)
- opencv学习笔记(三)
- OpenCV学习笔记(三)
- opencv学习笔记三
- opencv学习笔记三
- openCv学习笔记(三)——openCv数据结构之间的转换
- OpenCv学习笔记(三)——openCv数据结构之间的转换
- openCv学习笔记(三)——openCv数据结构之间的转换
- OpenCv学习笔记(三)——openCv数据结构之间的转换
- openCv学习笔记(三)——openCv数据结构之间的转换
- OpenCV学习笔记(二)—— OpenCV整体结构
- OpenCV学习笔记系列(三)
- OpenCV 2.2 的学习笔记(三)
- 三、openCV学习笔记(Image Processing)
- OpenCV学习笔记(三):邻域操作
- OpenCV学习笔记(三):腐蚀
- 237. Delete Node in a Linked List
- jquery
- TCP建立连接、传输数据、关闭连接的流程
- Oracle笔记(十五) 数据库备份
- Java反射的基础使用
- OpenCV学习笔记(三)—— OpenCV编程起点
- 解决Adb connection Error:远程主机强迫关闭了一个现有的连接
- Oracle笔记(十六) 数据库设计范式
- 1004
- 关于Android调用invalidate()之后不能及时调用ondraw()的解决办法
- 《Java JDK8学习笔记》读书笔记(4)
- 141. Linked List Cycle
- Maven常见错误
- 对称矩阵的缩放存储