当先锋百科网

首页 1 2 3 4 5 6 7


​  写在前面:嫌麻烦不想自己编译opencv的,可以直接下载我编译好的结果,然后直接跳到第5步,就可以把opencv用起来了。下载链接如下:
  链接:https://pan.baidu.com/s/1BEXhapUFbcvXu8b2y95m3A
  提取码:znzy

1.Windows下安装CMake

​  环境:Windows 10,64 位操作系统
​  CMake下载地址:https://cmake.org/download/或者https://github.com/Kitware/CMake/releases,第2个链接可以下载到老版本的CMake,我在第2个链接下载了3.8.2版本。我上传到了百度网盘,下载地址如下:
  链接:https://pan.baidu.com/s/1FA71BORLrWxcK66279Vt5w
  提取码:bl7k
在这里插入图片描述
​  下载下来的文件如下图所示,双击进行安装。
在这里插入图片描述
​  点击next
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  按快捷键win + r,然后输入cmd,打开命令行窗口。输入命令查看cmake的版本,可以正确打印版本信息,表示cmake安装成功。
在这里插入图片描述

2.opencv下载

​  OpenCV – 3.4.7下载链接:https://opencv.org/releases/page/3/
在这里插入图片描述
  点击sources,开始下载文件,下载好的文件如下图。我上传到了百度网盘,下载地址如下:
  链接:https://pan.baidu.com/s/1hKQIiX2OHX2wtksZ9CF6LQ
  提取码:9je3
在这里插入图片描述
​  opencv_contrib-3.4.7下载链接:https://github.com/opencv/opencv_contrib/tree/3.4.7
在这里插入图片描述
​  点击download zip,开始下载文件,下载好的文件如下图。我上传到了百度网盘,下载地址如下:
  链接:https://pan.baidu.com/s/1tilglFZnkfnG-uGCT9TC-g
  提取码:uz11
在这里插入图片描述

3.VS下载

​  vs2017社区版安装包下载地址:
​  链接:https://pan.baidu.com/s/1-Q3gyS_HFUBPFOrs96fn4A
​  提取码:v876

4.使用cmake编译opencv

​  新建一个命名为opencv的文件夹,将opencv-3.4.7.zip和opencv_contrib-3.4.7.zip解压到该文件夹,并新建一个命名为build的文件夹,如下图。
在这里插入图片描述
​  运行cmake,按下图填写两个目录,where is the source code:选择opencv源码目录,where to build the binaries:选择build目录。点击configure,弹出对话框,选择2017 win64,点击finish,即开始配置。
在这里插入图片描述
​  完成第一次配置后,出现如下画面,有很多行显示为红色,说明有问题,是因为有一些文件下载失败了,解决方案是手动下载。打开build文件夹中的CMakeDownloadLog.txt,可以看到哪些文件下载失败了,也可以知道手动下载这些文件后、应该放到哪个文件夹。以"boostdesc_bgm_bi.i"为例,下载完成后,放到这里:“D:/software/opencv/build/downloads/xfeatures2d/boostdesc_bgm_bi.i”;然后将"boostdesc_bgm_bi.i"复制一份,并把文件名改成"232c966b13651bd0e46a1497b0852191-boostdesc_bgm_bi.i",放到这里:“D:/software/opencv/opencv-3.4.7/.cache/xfeatures2d/boostdesc/232c966b13651bd0e46a1497b0852191-boostdesc_bgm_bi.i”。
在这里插入图片描述
​  所有下载失败的文件都完成以上操作以后,在cmake的界面中,勾选build_opencv_world和build_examples;设置opencv_extra_modules_path:opencv_contrib-3.4.7下的modules文件夹。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
​  点击configure,如果出现了文件下载失败的情况,解决方案和之前是一样的。处理好所有下载失败的文件以后,点击generate,结果如下。
在这里插入图片描述
​  generating done以后,打开我们最初新建的build文件夹,可以看到有一个名为OpenCV.sln的文件,使用vs2017打开OpenCV.sln。
在这里插入图片描述
​  vs2017中选择debug,x64。右键点击“解决方案opencv”,然后选择重新生成解决方案。
在这里插入图片描述
在这里插入图片描述
​  找到CMakeTargets下的INSTALL,右键点击INSTALL,选择仅用于项目–>仅生成INSTALL。
在这里插入图片描述
​  vs2017中选择release,x64,将上述过程重复一遍。

5.测试opencv

​  首先设置环境变量,设置好以后需要重启电脑。
在这里插入图片描述
​  打开vs2017,点击:文件–>新建–>项目,选择空项目,确定。
在这里插入图片描述
​  点击:视图–>其他窗口–>属性管理器。右键点击debug|x64,点击属性。在vc++目录中,设置包含目录和库目录及附加依赖项,如下图所示。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
​  在解决方案资源管理器中,新建源文件,编写opencv调用笔记本自带摄像头并显示的代码。

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int, char**)
{
	Mat frame;
	VideoCapture cap(0 + cv::CAP_DSHOW);

	// 打印默认分辨率,我这里是640*480
	double default_width = cap.get(cv::CAP_PROP_FRAME_WIDTH);
	double default_height = cap.get(cv::CAP_PROP_FRAME_HEIGHT);
	printf("default infos: default_width = %lf, default_height = %lf\n", default_width, default_height);

	// 我的笔记本电脑自带的摄像头分辨率是100w的,高于默认分辨率,这里修改一下分辨率
	cap.set(cv::CAP_PROP_FRAME_WIDTH, 5000);
	cap.set(cv::CAP_PROP_FRAME_HEIGHT, 5000);

	// 打印修改后的分辨率,我这里是1280*720
	double changed_width = cap.get(cv::CAP_PROP_FRAME_WIDTH);
	double changed_height = cap.get(cv::CAP_PROP_FRAME_HEIGHT);
	printf("changed infos: changed_width = %lf, changed_height = %lf\n", changed_width, changed_height);

	// 检查摄像头是否打开
	if (!cap.isOpened()) {
		cerr << "ERROR! Unable to open camera\n";
		return -1;
	}

	cout << "Start grabbing" << endl << "Press Esc to terminate" << endl << "Press s to save the image" << endl;
	for (;;)
	{
		// wait for a new frame from camera and store it into 'frame'
		cap.read(frame);
		// check if we succeeded
		if (frame.empty()) {
			cerr << "ERROR! blank frame grabbed\n";
			break;
		}
		// show live and wait for a key with timeout long enough to show images
		imshow("Live", frame);
		int value = waitKey(5);
		// 小写s的ASCII码是27
		if (value == 27)
			break;
		// Esc的ASCII码是115
		if (value == 115)
			imwrite("shot.jpg", frame);
	}
	// the camera will be deinitialized automatically in VideoCapture destructor
	return 0;
}