VS OpenCv配置:
首先是VS的OpenCv配置,外部库目录指定和外部包含文件的指定。
- 指定建立的工程为空白工程:
- 建立完工程之后,我们选中解决方案栏中的Resource Files目录(即源码目录),然后新建一个C++源码文件:
- 设置源码的文件名,例如:Main,然后创建此源码文件到工程中:
- 在VS中有个叫做“属性管理器”的工具,用于进行VS整体参数的配置,配置一次之后,以后所有新建项目都能应用改配置,不用再一一进行配置操作,使用起来也非常方便。点击工具栏中的:View—>Other Windows—>Property Manger打开属性管理器:
- 在新出现的属性管理器栏中,展开目录,选中Debug|Win64中的Microsoft.Cpp.x64.user,并右键点击属性(Properties)进入属性界面:
1)配置包含目录:
在通用属性(Common Properties)—>VC ++目录—>包含目录,然后点击右侧三角标志选中Edit进入编辑:
向其中添加下面三个路径:
E:\OpenCV\opencv\build\include
E:\OpenCV\opencv\build\include\opencv
E:\OpenCV\opencv\build\include\opencv2
2)配置库文件目录:
完成上面的包含目录配置之后,我们还需要进行库文件的配置:回到属性界面,选择包含目录下面的Library Directories(库文件目录):
向库文件目录下添加OpenCV的库文件目录:E:\OpenCV\opencv\build\x64\vc14\lib,这个目录根据每个人自己在第一步安装OpenCV中选择的目录进行选定:
3)配置动态链接库:
我们可以查看步骤2)中添加的库文件目录下面.lib文件列表,发现在3.1.0版本的OpenCV中,仅剩下两个库文件,分别是:opencv_world310.lib和opencv_world310d.lib,这里两个库文件的区别就是:opencv_world310.lib是Release模式版本,而opencv_world310d.lib是Debug模式版本:
跟上述两个步骤相似,在属性界面中打开Linker(链接库)—>Input(输入)—>Additional Dependencies(添加依赖):
将我们刚刚在OpenCV库文件目录下看到的两个库文件其中一个添加到这里(根据模式需求Release模式或Debug模式):
上面部分为新建工程时VS的Opencv的配置,配置好了之后可以引入头文件,使用Opencv了。
OpenCv图像处理:
(1).首先讲解OpenCv改变图像大小,这里以调用摄像头举例。
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\opencv.hpp>
using namespace cv;
int main()
{
//【1】从摄像头读入视频
VideoCapture capture(0);
while (1)
{
Mat frame; //定义一个Mat变量,用于存储每一帧的图像
capture >> frame; //读取当前帧
resize(frame,frame,Size(360,240)); //改变图像大小
imshow("aa", frame);
waitKey(30); //延时30ms
}
return 0;
}
resize函数可以改变图像大小。
对于传递矩阵opencv矩阵赋值函数copyTo、clone、重载元算赋‘=’之间实现的功能相似均是给不同的矩阵赋值功能。copyTo和clone函数基本相同,被赋值的矩阵和赋值矩阵之间空间独立,不共享同一空间。但是重载元算赋‘=’,被赋值的矩阵和赋值矩阵之间空间共享,改变任一个矩阵的值,会同时影响到另一个矩阵。
(2).然后讲解OpenCv改变图像编码格式
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\opencv.hpp>
using namespace cv;
int main()
{
//【1】从摄像头读入视频
VideoCapture capture(0);
while (1)
{
Mat frame; //定义一个Mat变量,用于存储每一帧的图像
capture >> frame; //读取当前帧
cvtColor(frame,frame,CV_RGB2GRAY); //转为灰度图
imshow("aa", frame);
waitKey(30); //延时30ms
}
return 0;
}
cvtColor改变编码格式,常用的是COLOR_RGB2GRAY(CV_RGB2GRAY)
还有接近人的直观感觉的COLOR_RGB2HSV(CV_RGB2HSV),颜色信息(H)、饱和度(S)、亮度(V)。
转化后颜色改变,因为imshow命令里面接受的参数是RGB空间的矩阵,把HSV空间的矩阵给imshow,会把它解释为RGB空间的矩阵,显示出的效果就不是源图像了.
HSV范围(根据实际情况改)
这里给出一个获取HSV的代码。
#include<opencv2\opencv.hpp>
#include <ctype.h>
#include "iostream"
using namespace std;
using namespace cv;
void on_mouse(int EVENT, int x, int y, int flags, void* userdata);
int main(int argc, char** argv)
{
Mat src, hsv;
//此处更改图片地址
src = imread("C:\\Users\\ttp\\Pictures\\Camera Roll\\WIN_20180714_14_18_10_Pro.jpg");
namedWindow("【display】");
setMouseCallback("【display】", on_mouse, &src);
while (1)
{
imshow("【display】", src);
waitKey(40);
}
}
void on_mouse(int EVENT, int x, int y, int flags, void* userdata)
{
Mat rgb, hsv;
rgb = *(Mat*)userdata;
Mat temp;
cvtColor(*(Mat*)userdata, hsv, CV_RGB2HSV);
Point p(x, y);
switch (EVENT)
{
case EVENT_LBUTTONDOWN:
{
printf("b=%d\t", rgb.at<Vec3b>(p)[0]);
printf("g=%d\t", rgb.at<Vec3b>(p)[1]);
printf("r=%d\n", rgb.at<Vec3b>(p)[2]);
printf("H=%d\t", hsv.at<Vec3b>(p)[0]);
printf("S=%d\t", hsv.at<Vec3b>(p)[1]);
printf("V=%d\n", hsv.at<Vec3b>(p)[2]);
circle(rgb, p, 2, Scalar(255), 3);
}
break;
}
}
(3).然后再讲解OpenCv图像的颜色识别
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\opencv.hpp>
using namespace cv;
int alpha_slider1, alpha_slider2;
void on_trackbar(int, void*) {}
int main()
{
VideoCapture capture(0); //【1】从摄像头读入视频
namedWindow("[总]");
createTrackbar("Hmin", "[总]", &alpha_slider1, 180, on_trackbar);
createTrackbar("Hmax", "[总]", &alpha_slider2, 180, on_trackbar);
while (1)
{
Mat frame; //定义一个Mat变量,用于存储每一帧的图像
Mat HSV;
Mat mask; //保存inRange后的值
capture >> frame; //读取当前帧
cvtColor(frame, HSV, COLOR_RGB2HSV); //转化为HSV
inRange(HSV, Scalar(alpha_slider1, 43, 46), Scalar(alpha_slider2, 255, 255), mask);
imshow("保存", mask);
imshow("[总]", frame);
waitKey(30); //延时30ms
}
return 0;
}
z
这个程序会创建一个滑动条来改变H的值,从而识别颜色
函数原型(C++):
void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst)dst(I) = lowerb(I)0 ≤ src(I)0 < upperb(I)0 ∧ lowerb(I)1 ≤ src(I)1 < upperb(I)1 ∧lowerb(I)2 ≤ src(I)2 < upperb(I)2
即,每个通道的像素值都必须在规定的阈值范围内!
这篇文章先讲到这。