ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

OpenCV的安装、环境配置和例程运行详解

2020-02-25 19:06:05  阅读:333  来源: 互联网

标签:opencv 例程 路径 OpenCV 详解 所示 目录 points


目录

  1. 概述
  2. 安装
  3. 运行环境配置
  4. 例程运行
    4.1 修改debug模式
    4.2 添加包含目录
    4.3 添加库目录
    4.4 添加附加依赖项
    4.5 运行结果
  5. 问题处理
  6. 附件
    6.1 guanliufa.cpp源代码
  7. 参考文献

1.概述
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。该库也有大量的Python、Java and MATLAB/OCTAVE(版本2.5)的接口。这些语言的API接口函数可以通过在线文档获得。如今也提供对于C#、Ch、Ruby,GO的支持。

2. 安装
由于OpenCV库是使用C\C++语言编写的源码,因此OpenCV库在各种支持C\C++编译的开发环境(Windows下的Visual Studio,Linux下的Eclipse等)下都可以运行,OpenCV库的使用方法也特别简单,只需要在项目属性中把OpenCV库包含进来,再在头文件中include对应的文件(根据实际需要用到的功能包含对应的头文件)即可,OpenCV库的下载地址为:https://opencv.org/releases/ 。
以下以图文的方式介绍一下如何在Windows下安装OpenCV库。
首先在上文给的OpenCV官网主页中间找到最新版的OpenCV库下载地址,如下图所示,截至目前已发布的最新版为4.2.0版本。
图1  OpenCV库下载主页

点击上图中的Windows,下载Windows版本,点击之后,页面转到如图2所示界面,5秒之后,自动下载,自己选择文件的下载路径即可。下载之后的安装包如图3所示。
图2  OpenCV库下载主页

图3  下载之后的OpenCV安装包

将下载之后的OpenCV安装包解压缩即可完成安装操作,解压缩之后得到一个文件夹如图4所示,其中build是OpenCV使用时要用到的一些库文件,而sources中则是OpenCV官方为我们提供的一些demo示例源码。需要注意的是将解压之后的文件夹尽量放在英文命名的路径中,以免在编译时出现问题。
图4  解压之后的文件夹

3. 运行环境配置
鼠标左键选择桌面上的“此电脑”,右击选择“属性”,然后如下图所示依次选择:高级系统设置—>环境变量—>path—>编辑—>新建。点击“新建”之后需要填写你的OpenCV执行文件的路径,然后一路点确定,这样环境变量就配置完了。
图5  环境配置步骤

我的OpenCV执行文件的路径是E:\opencv-4.2.0-vc14_vc15\opencv\build\x64\vc15\bin,路径如下图所示。OpenCV的执行文件路径为opencv_worldxxx.dll文件所在路径,其中xxx为OpenCV的版本号,因为我的是4.2.0版本,所以是opencv_world420.dll。
图6  OpenCV执行文件路径

4. 例程运行
在OpenCV安装和配置好之后,接下来我们就使用OpenCV库做一个小实验,首先在Visual Studio上新建一个C/C++工程项目(笔者使用的Visual Studio 2019,使用VS新建C/C++工程项目的过程,这里不再赘述,具体新建过程可以参看我的博客:https://blog.csdn.net/weixin_45179023/article/details/104199189),我的项目名称为OpencvDemo1,源程序文件为guanliufa.cpp。程序的源代码见本文附件1。
4.1 修改debug模式
代码写好之后还要做相关配置才能运行,首先如下图所示把debug模式改为x64,VS默认的debug模式为x86,如不修改,编译时将报错。
在这里插入图片描述
4.2 添加包含目录
如下图所示鼠标左击选中项目名称:OpencvDemo1,然后右击之后选中最下面的“属性”弹出来如下所示的属性页,再依次选择VC++目录—>包含目录,点击4之后选择包含目录路径,我的包含路径为:E:\opencv-4.2.0-vc14_vc15\opencv\build\include。每个版本解压包的包含目录路径都差不多。选择好包含目录路径之后,一路点击确定即可完成配置。
在这里插入图片描述
4.3 添加库目录
类似于“添加包含目录”的操作,如下图所示,依次选择项目—>属性—>VC++目录—>库目录—>编辑,填写库目录路径,我的库目录路径为:E:\opencv-4.2.0-vc14_vc15\opencv\build\x64\vc15\lib。每个版本解压包的库目录都差不多。选择好库目录之后,一路点击确定即可完成配置。
在这里插入图片描述
4.4 添加附加依赖项
类似于“添加包含目录”的操作,如下图所示,依次选择项目—>属性—>链接器—>输入—>附加依赖项,填写附加依赖项,我的附加依赖项为:opencv_world420d.lib。
在这里插入图片描述
附加依赖项的文件形式为opencv_worldxxxd.lib。其中xxx为版本号,因为我的版本号为420,所以附加依赖项为opencv_world420d.lib。另外要注意opencv_world420d.lib与opencv_world420.lib的区别。
在这里插入图片描述
其中前者为debug模式下的附加依赖项,后者为release模式下的附加依赖项。
4.5 运行结果
经过以上操作之后,项目工程创建成功,可以运行查看结果了,运行之后,程序会自动打开电脑的摄像头,鼠标左击视频中的点迹,会出现绿色标志,当视频中的物体运动时,绿色标志会跟踪原来标志的部位。如下为笔者的运行截图。
在这里插入图片描述
5. 问题处理
在按照上述步骤进行操作之后,编译没有报错提示,但是运行时却出现了问题,弹出下图所示的提示。
在这里插入图片描述

在网上搜索之后,我将如下图所示
E:\opencv-4.2.0-vc14_vc15\opencv\build\x64\vc15\bin路径下的三个dll文件拷贝到Windows\System32文件夹下,问题得到完美解决。
在这里插入图片描述

6. 附件
6.1 guanliufa.cpp源代码

/************************************************************
代码来自:https://blog.csdn.net/weixin_43201433/article/details/87869823
功能:该程序会自动打开计算机的摄像头,通过鼠标点击视频上的点,目标运动时,标记会跟踪该点。
************************************************************/
#include "opencv2/video/tracking.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/videoio.hpp"
#include "opencv2/highgui.hpp"

#include <iostream>
#include <ctype.h>

using namespace cv;
using namespace std;

static void help()
{
	// print a welcome message, and the OpenCV version
	cout << "\nThis is a demo of Lukas-Kanade optical flow lkdemo(),\n"
		"Using OpenCV version " << CV_VERSION << endl;
	cout << "\nIt uses camera by default, but you can provide a path to video as an argument.\n";
	cout << "\nHot keys: \n"
		"\tESC - quit the program\n"
		"\tr - auto-initialize tracking\n"
		"\tc - delete all the points\n"
		"\tn - switch the \"night\" mode on/off\n"
		"To add/remove a feature point click it\n" << endl;
}

Point2f point;
bool addRemovePt = false;

static void onm ouse(int event, int x, int y, int /*flags*/, void* /*param*/)
{
	if (event == EVENT_LBUTTONDOWN)
	{
		point = Point2f((float)x, (float)y);
		addRemovePt = true;
	}
}

int main(int argc, char** argv)
{
	VideoCapture cap;
	TermCriteria termcrit(TermCriteria::COUNT | TermCriteria::EPS, 20, 0.03);
	Size subPixWinSize(10, 10), winSize(31, 31);

	const int MAX_COUNT = 500;
	bool needToInit = false;
	bool nightMode = false;

	help();
	cv::CommandLineParser parser(argc, argv, "{@input|0|}");
	string input = parser.get<string>("@input");

	if (input.size() == 1 && isdigit(input[0]))
		cap.open(input[0] - '0');
	else
		cap.open(input);

	if (!cap.isOpened())
	{
		cout << "Could not initialize capturing...\n";
		return 0;
	}

	namedWindow("LK Demo", 1);
	setMouseCallback("LK Demo", onm ouse, 0);

	Mat gray, prevGray, image, frame;
	vector<Point2f> points[2];

	for (;;)
	{
		cap >> frame;
		if (frame.empty())
			break;

		frame.copyTo(image);
		cvtColor(image, gray, COLOR_BGR2GRAY);

		if (nightMode)
			image = Scalar::all(0);

		if (needToInit)
		{
			// automatic initialization
			goodFeaturesToTrack(gray, points[1], MAX_COUNT, 0.01, 10, Mat(), 3, 3, 0, 0.04);
			cornerSubPix(gray, points[1], subPixWinSize, Size(-1, -1), termcrit);
			addRemovePt = false;
		}
		else if (!points[0].empty())
		{
			vector<uchar> status;
			vector<float> err;
			if (prevGray.empty())
				gray.copyTo(prevGray);
			calcOpticalFlowPyrLK(prevGray, gray, points[0], points[1], status, err, winSize,
				3, termcrit, 0, 0.001);
			size_t i, k;
			for (i = k = 0; i < points[1].size(); i++)
			{
				if (addRemovePt)
				{
					if (norm(point - points[1][i]) <= 5)
					{
						addRemovePt = false;
						continue;
					}
				}

				if (!status[i])
					continue;

				points[1][k++] = points[1][i];
				circle(image, points[1][i], 3, Scalar(0, 255, 0), -1, 8);
			}
			points[1].resize(k);
		}

		if (addRemovePt && points[1].size() < (size_t)MAX_COUNT)
		{
			vector<Point2f> tmp;
			tmp.push_back(point);
			cornerSubPix(gray, tmp, winSize, Size(-1, -1), termcrit);
			points[1].push_back(tmp[0]);
			addRemovePt = false;
		}

		needToInit = false;
		imshow("LK Demo", image);

		char c = (char)waitKey(10);
		if (c == 27)
			break;
		switch (c)
		{
		case 'r':
			needToInit = true;
			break;
		case 'c':
			points[0].clear();
			points[1].clear();
			break;
		case 'n':
			nightMode = !nightMode;
			break;
		}

		std::swap(points[1], points[0]);
		cv::swap(prevGray, gray);
	}

	return 0;
}

7. 参考文献

  1. windows 下OpenCV的安装部署详细教程:https://blog.csdn.net/maizousidemao/article/details/81474834
  2. 由于找不到opencv_world320d.dll,无法继续执行代码解决方案:https://blog.csdn.net/weixin_41215479/article/details/85252942
  3. OpenCV的5个经典例程:https://blog.csdn.net/weixin_43201433/article/details/87869823
  4. OpenCV百度百科:https://baike.baidu.com/item/opencv/10320623?fr=aladdin
Yun_Geek 发布了3 篇原创文章 · 获赞 0 · 访问量 210 私信 关注

标签:opencv,例程,路径,OpenCV,详解,所示,目录,points
来源: https://blog.csdn.net/weixin_45179023/article/details/104502861

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有