OpenCv VS C++ 图像处理(上)

 VS OpenCv配置:

 首先是VS的OpenCv配置,外部库目录指定和外部包含文件的指定。

  1. 指定建立的工程为空白工程:
  2. 建立完工程之后,我们选中解决方案栏中的Resource Files目录(即源码目录),然后新建一个C++源码文件:
  3. 设置源码的文件名,例如:Main,然后创建此源码文件到工程中: 
  4. 在VS中有个叫做“属性管理器”的工具,用于进行VS整体参数的配置,配置一次之后,以后所有新建项目都能应用改配置,不用再一一进行配置操作,使用起来也非常方便。点击工具栏中的:View—>Other Windows—>Property Manger打开属性管理器:
  5. 在新出现的属性管理器栏中,展开目录,选中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.libopencv_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

即,每个通道的像素值都必须在规定的阈值范围内!

这篇文章先讲到这。


        

猜你喜欢

转载自blog.csdn.net/qq_40515692/article/details/81042303