1.OpenCV中预定义的宏
OpenCV里面有很多CV_EVENT_LBUTTONDOWN这样大写的,这些是预先定义的宏。
CV_ :这是Opencv的标志,表明这个宏不是windows宏,是opencv定义的。
EVENT_ :表示是一个事件中要用的。
flag: 代表拖拽事件。
CV_EVENT_MOUSEMOVE =0,//滑动
CV_EVENT_LBUTTONDOWN =1,//左键点击
CV_EVENT_RBUTTONDOWN =2,//右键点击
CV_EVENT_MBUTTONDOWN =3,//中键点击
CV_EVENT_LBUTTONUP =4,//左键放开
CV_EVENT_RBUTTONUP =5,//右键放开
CV_EVENT_MBUTTONUP =6,//中键放开
CV_EVENT_LBUTTONDBLCLK =7,//左键双击
CV_EVENT_RBUTTONDBLCLK =8,//右键双击
CV_EVENT_MBUTTONDBLCLK =9//中键双击
CV_EVENT_FLAG_LBUTTON =1,//左键拖曳
CV_EVENT_FLAG_RBUTTON =2,//右键拖曳
CV_EVENT_FLAG_MBUTTON =4,//中键拖曳
CV_EVENT_FLAG_CTRLKEY =8,//按CTRL
CV_EVENT_FLAG_SHIFTKEY =16,//按SHIFT
CV_EVENT_FLAG_ALTKEY =32//按ALT
2.遇到的问题
(1)无法打开源文件
依次点击“项目——配置属性——C/C++——常规”,在“附加包含目录”中加入.h文件所在的文件夹路径
(2)无法打开文件“XXX.lib”
方法1:依次点击“项目——配置属性——链接器——常规”,在“附加库目录”中加入.lib所在的文件夹的路径
方法2:在“链接器”中找到“输入”,在“附加依赖项”中加入需要加入的xxx.lib;(要用;和其他链接库分隔开)
.lib是一种文件名后缀,代表的是静态数据连接库,在windows操作系统中起到链接程序和函数(或子过程)的作用。
3.JVM、JRE、JDK
与 Java 语言相关的名词,初期必须掌握的有三个:
JVM:Java Virtual Machine 的缩写,Java虚拟机。作用是:运行 Java 字节码文件。
JRE:Java Runtime Environment 的缩写,Java运行环境。作用是:运行 Java 程序所必须的环境的集合,包含 JVM 标准实现及 Java 核心类库。
JDK:Java Development Kit 的缩写,Java 语言的软件开发工具包(SDK,Software Development Kit)。作用是:JDK 是整个 Java 开发的核心,它包含了Java 的运行环境(JVM + Java 系统类库)和 Java 工具。
它们三个的关系是:JDK包含JRE,JRE包含JVM。
JDK 为了使用于不同的环境,所以有多个不同的版本。它们分别是:
Java SE,Standard Edition,标准版,是通用的一个版本。
Java EE,Enterprise Edition,企业版,使用这种 JDK 开发 Java EE 应用程序。
Java ME,Micro Edition,主要用于移动设备、嵌入式设备上的 Java 应用程序。
4.OpenCV的Rect矩形类简介和使用
//如果创建一个Rect对象rect(100, 50, 50, 100),那么rect会有以下几个功能:
rect.area(); //返回rect的面积 5000
rect.size(); //返回rect的尺寸 [50 × 100]
rect.tl(); //返回rect的左上顶点的坐标 [100, 50]
rect.br(); //返回rect的右下顶点的坐标 [150, 150]
rect.width(); //返回rect的宽度 50
rect.height(); //返回rect的高度 100
rect.contains(Point(x, y)); //返回布尔变量,判断rect是否包含Point(x, y)点
//还可以求两个矩形的交集和并集
rect = rect1 & rect2;
rect = rect1 | rect2;
//还可以对矩形进行平移和缩放
rect = rect + Point(-100, 100); //平移,也就是左上顶点的x坐标-100,y坐标+100
rect = rect + Size(-100, 100); //缩放,左上顶点不变,宽度-100,高度+100
//还可以对矩形进行对比,返回布尔变量
rect1 == rect2;
rect1 != rect2;
5.C++ vector用法
在c++中,vector是一个十分有用的容器,下面对这个容器做一下总结。
基本操作:
(1)头文件#include.
(2)创建vector对象,vector vec;
(3)尾部插入数字:vec.push_back(a);
(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。
(5)使用迭代器访问元素.
vector::iterator it; //iterator 迭代器,迭代程序;
for(it=vec.begin();it!=vec.end();it++)
cout<<*it<<endl;
(6)插入元素: vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;
(7)删除元素: vec.erase(vec.begin()+2);删除第3个元素 vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始
(8)向量大小:vec.size();
(9)清空:vec.clear();
另外:
vector的元素不仅仅可以使int,double,string,还可以是结构体,但是要注意:结构体要定义为全局的,否则会出错。
6.rectangle
函数是用来绘制一个矩形框的,通常用在图片的标记上。
rectangle(img2, Point(j,i), Point(j + img4.cols, i + img4.rows), Scalar(255, 255, 0), 2, 8);
参数解释:
img2:要做处理的图片
二三代表左上右下矩形的角坐标
scalar:颜色
2代表线条宽度
8是线型,默认取8
Rect函数也是画矩形的,但与上面的有所不同
Rect(x,y,width,height),x, y 为左上角坐标, width, height 则为长和宽。
7.图像变换函数
void flip(InputArray src, OutputArray dst, int flipCode)
图像变换函数,第三个参数为1时,表示水平反转,0表示垂直反转,负数表示既有水平又有垂直反转。
8.OpenCV中的浅拷贝
为介绍OpenCV中的浅拷贝,我们还是从cv::Mat说起吧。cv::Mat类是用于保存图像以及其他矩阵数据的数据结构。
当cv::Mat实例化后,分配内存;当对象离开作用域后,分配的内存自动释放。cv::Mat实现了引用计数以及浅拷贝。
引用计数的作用是只有当所有引用内存数据的对象都被析构后,内存才会释放。浅拷贝是指当图像之间进行赋值时,图像数据并未发生复制,而是两个对象都指向同一块内存块。
9.opencv中namedWindow( )函数用法总结
第一步,功能说明:namedWindow()的功能就是新建一个显示窗口。可以指定窗口的类型。
第二步,API详解:原型:void nameWindow(const string& winname,int flags = WINDOW_AUTOSIZE) ;
参数1:新建的窗口的名称。自己随便取。
参数2:窗口的标识,一般默认为WINDOW_AUTOSIZE 。
WINDOW_AUTOSIZE 窗口大小自动适应图片大小,并且不可手动更改。
WINDOW_NORMAL 用户可以改变这个窗口大小
WINDOW_OPENGL 窗口创建的时候会支持OpenGL
第三步,代码展示:
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img;
img = imread("image3.jpg",1);//参数1:图片路径。参数2:显示原图
namedWindow("窗口1",CV_WINDOW_NORMAL);
/*注释
参数1:窗口的名字
参数2:窗口类型,CV_WINDOW_AUTOSIZE 时表明窗口大小等于图片大小。不可以被拖动改变大小。
CV_WINDOW_NORMAL 时,表明窗口可以被随意拖动改变大小。
*/
imshow("窗口1",img);//在“窗口1”这个窗口输出图片。
waitKey(5000);//等待5秒,程序自动退出。改为0,不自动退出。
return 0;
}