欢迎大家访问我的github:https://github.com/Iamttp 有问题欢迎在评论留言呀!
OpenCv专栏:https://blog.csdn.net/qq_40515692/article/details/102885061
2020/2/5更新:
VS2019/VS2017 OpenCv配置:
VS对于C++配置外部库有两种方式,另一种写在了后面,这里介绍的是新建配置文件的方式,这种方式好处是一劳永逸,我重装电脑后直接用的之前在VS2017上生成的配置文件配置的VS2019。所以非常方便。
首先是VS的OpenCv配置,外部库目录指定和外部包含文件的指定。
取个和项目相关的名字吧。然后双击刚刚新建的文件。
1)配置包含目录:
在通用属性(Common Properties)—>VC ++目录—>包含目录,然后点击右侧三角标志选中Edit进入编辑:
向其中添加下面三个路径(你自己的OpenCv安装的位置):
F:\opencv\build\include
F:\opencv\build\include\opencv
F:\opencv\build\include\opencv2
2)配置库文件目录:
完成上面的包含目录配置之后,我们还需要进行库文件的配置:回到属性界面,选择包含目录下面的Library Directories(库文件目录):
向库文件目录下添加OpenCV的库文件目录:F:\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模式版本:
我们刚刚选的Debug模式版本,跟上述两个步骤相似,在属性界面中打开Linker(链接库)—>Input(输入)—>Additional Dependencies(添加依赖):
将我们刚刚在OpenCV库文件目录下看到的两个库文件其中一个添加到这里:
上面部分为新建工程时VS的Opencv的配置,配置好了之后可以引入头文件,使用OpenCv了。正常运行:
VS OpenCv配置:
首先是VS的OpenCv配置,外部库目录指定和外部包含文件的指定。
1)配置包含目录:
在通用属性(Common Properties)—>VC ++目录—>包含目录,然后点击右侧三角标志选中Edit进入编辑:
向其中添加下面三个路径(你自己的OpenCv安装的位置):
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
#include
#include
using namespace cv;
int main()
{
// 从摄像头读入视频
VideoCapture capture(0);
while (1)
{
Mat frame; //定义一个Mat变量,用于存储每一帧的图像
capture >> frame; //读取当前帧
resize(frame, frame, Size(360, 240)); //改变图像大小
imshow("aa", frame);
waitKey(30); //延时30ms
}
return 0;
}
using namespace cv;引入OpenCv的命名空间。
VideoCapture是一个摄像头类,可以读取摄像头或者本地的视频文件。
Mat是OpenCv的矩阵类,一般用来存储图像。
resize函数可以改变图像大小。
(2).然后讲解OpenCv改变图像编码格式
#include
#include
#include
using namespace cv;
int main()
{
// 从摄像头读入视频
VideoCapture capture(0);
while (1)
{
Mat frame; //定义一个Mat变量,用于存储每一帧的图像
capture >> frame; //读取当前帧
cvtColor(frame, frame, CV_BGR2GRAY); //转为灰度图
imshow("aa", frame);
waitKey(30); //延时30ms
}
return 0;
}
首先需要注意的是OpenCv的图片是按BGR顺序存储的。
早期的OpenCV开发者选择BGR颜色格式的原因在于主流的摄像头制造商和软件供应商都普遍使用这种格式,比如说Windows在用COLORREF描述颜色值的时候用的就是BGR格式: 0x00bbggrr
cvtColor改变编码格式,常用的是COLOR_BGR2GRAY(CV_BGR2GRAY)
还有接近人的直观感觉的COLOR_BGR2HSV(CV_BGR2HSV),颜色信息(H)、饱和度(S)、亮度(V)。
转化后颜色改变,因为imshow命令里面接受的参数是BGR空间的矩阵,把HSV空间的矩阵给imshow,会把它解释为BGR空间的矩阵,显示出的效果就不是源图像了.
HSV范围(根据实际情况改)
这里给出一个获取HSV的代码。
#include
#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\\2.png");
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_BGR2HSV);
Point p(x, y);
switch (EVENT)
{
case EVENT_LBUTTONDOWN:
{
printf("b=%d\t", rgb.at(p)[0]);
printf("g=%d\t", rgb.at(p)[1]);
printf("r=%d\n", rgb.at(p)[2]);
printf("H=%d\t", hsv.at(p)[0]);
printf("S=%d\t", hsv.at(p)[1]);
printf("V=%d\n", hsv.at(p)[2]);
circle(rgb, p, 2, Scalar(255), 3);
}
break;
}
}
setMouseCallback会捕获指定窗口的鼠标消息。
(3).然后再讲解OpenCv图像的颜色识别
#include
#include
#include
using namespace cv;
int alpha_slider1, alpha_slider2;
void on_trackbar(int, void*) {}
int main()
{
VideoCapture capture(0); // 从摄像头读入视频
namedWindow("[总]");
createTrackbar("Hmin", "[总]", &alpha_slider1, 180, on_trackbar);
createTrackbar("Hmax", "[总]", &alpha_slider2, 180, on_trackbar);
Mat frame; // 定义一个Mat变量,用于存储每一帧的图像
Mat HSV;
Mat mask; // 保存inRange后的值
while (1)
{
capture >> frame; // 读取当前帧
cvtColor(frame, HSV, COLOR_BGR2HSV); // 转化为HSV
inRange(HSV, Scalar(alpha_slider1, 43, 46), Scalar(alpha_slider2, 255, 255), mask);
imshow("保存", mask);
imshow("[总]", frame);
waitKey(30); // 延时30ms
}
return 0;
}
这个程序会创建一个滑动条来改变H的值,从而识别颜色
createTrackbar会在指定窗口创建滑动条。
函数原型(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
即,每个通道的像素值都必须在规定的阈值范围内!
这篇文章先讲到这。