OpenCV : [Open Computer Vision Library]
是一个基于Apache2.0
许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux
、Windows
、Android
和Mac OS
等众多操作系统上。
备注: 由于OpenCV
的官网 https://opencv.org
无法打开,建议访问 github
。
一、GitHub获取openCV
1、预编译版安装
访问 https://github.com/opencv/opencv/release
地址,下载 "opencv-4.9.0-windows.exe"
(precompile)版本 。
网络好的情况下,下载 "opencv-4.9.0-windows.exe"
很快;网络不好的情况下,可以换个时间段试一试。
① 安装
- 双击
"opencv-4.9.0-windows.exe"
程序,选择安装目录。
② 环境变量配置(该步骤可以不做)
- 以管理员运行安装目录下的
"setup_vars_opencv4.cmd"
脚本进行环境变量设置。
"setup_vars_opencv4.cmd"
脚本内容如下:
@ECHO OFF
SET "SCRIPT_DIR=%~dp0"
IF NOT DEFINED OPENCV_QUIET ( ECHO Setting vars for OpenCV 4.9.0 )
SET "PATH=%SCRIPT_DIR%\x64/vc16/bin;%PATH%"
IF NOT DEFINED OPENCV_SKIP_PYTHON CALL :SET_PYTHON
SET SCRIPT_DIR=
IF NOT [%1] == [] GOTO :RUN_COMMAND
GOTO :EOF
:RUN_COMMAND
SET RUN_INTERACTIVE=1
echo %CMDCMDLINE% | find /i "%~0" >nul
IF NOT errorlevel 1 set RUN_INTERACTIVE=0
%*
SET RESULT=%ERRORLEVEL%
IF %RESULT% NEQ 0 (
IF _%RUN_INTERACTIVE%_==_0_ ( IF NOT DEFINED OPENCV_BATCH_MODE ( pause ) )
)
EXIT /B %RESULT%
:SET_PYTHON
SET "PYTHONPATH_OPENCV=%SCRIPT_DIR%\python"
IF NOT DEFINED OPENCV_QUIET ( ECHO Append PYTHONPATH: %PYTHONPATH_OPENCV% )
SET "PYTHONPATH=%PYTHONPATH_OPENCV%;%PYTHONPATH%"
SET PYTHONPATH_OPENCV=
EXIT /B
:EOF
③ C/C++ API
#1. 动态库、静态库路径
C:\opencv\build\x64\vc16\bin
C:\opencv\build\x64\vc16\lib
#2.头文件路径
C:\opencv\build\include
2、源码编译安装
① 下载源码
从 github
下载 "opencv-4.9.0.zip"
和 "opencv_contrib-4.9.0.zip"
。
下载 opencv_contrib
源码。
关于opencv_contrib
解释如下:
② 准备工作
将 "opencv-4.9.0.zip"
和 "opencv_contrib-4.9.0.zip"
解压到同一个目录下,如解压到 opencv-source
目录下。
③ 开始编译
进入到 opencv-4.9.0
目录,创建临时编译目录 "opencv_build_dir"
(这样不污染源码),进入到临时编译目录,执行CMD
命令。
官网提供的命令如下:
$ cd <opencv_build_directory>
$ cmake -DOPENCV_EXTRA_MODULES_PATH=<opencv_contrib>/modules <opencv_source_directory>
$ make -j5
- Windows 配置生成命令如下:
C:\Tools\opencv-source\opencv-4.9.0\opencv_build_dir>cmake -DOPENCV_EXTRA_MODULES_PATH=C:\Tools\opencv-source\opencv_contrib-4.9.0\modules C:\Tools\opencv-source\opencv-4.9.0
配置完成。
- Windows 编译命令如下:
cmake --build ./ -j5
编译完成,分别在 bin
、lib
目录下生成对应的文件。
3、VS2019验证
① 显示图片
创建 VS2019
工程,验证opencv
是否可用。
#include <opencv2/opencv.hpp>
int main()
{
cv::Mat img = cv::imread("cat.jpg");
if(img.empty()) return -1;
cv::namedWindow("CAT",cv::WINDOW_AUTOSIZE);
cv::imshow("CAT", img);
cv::waitKey(0);
cv::destroyWindow("CAT");
}
首先OpenCV的函数都位于命名空间cv下,如果想省略cv::,可以在前面用using namespace cv。但这样存在与其他命名空间冲突的风险。
函数imread()根据文件名来决定图像格式的处理,也会自动申请图像需要的内存,它可以读取很多种图像格式,函数返回一个Mat结构,这个结构是OpenCV中你会接触的最多的自带结构,OpenCV用这个结构来处理所有类型的图像:单通道、多通道、整型、浮点数以及各种类型。
函数namedWindow由HighGUi模块提供,将一个名称赋予窗口。第二个参数说明了Windows的特性。默认情况下全部设置为0,也可以设置为WINDOW_AUTOSIZE,这样窗口的大小会和载入图像的大小一致,图像会被缩放以使用窗口。
通过imshow()来进行显示。imshow()将建一个窗口。(如果窗口不存在他会自动调用namedWindow()新建一个窗口)。调用imshow()时窗口将被重绘上要求的图片,并且窗口会自动调整大小(使用参数WINDOW_AUTOSIZE)。
waitkey(0)函数告诉系统暂停并等待键盘事件。如果传入参数大于0则会意味着程序等待的毫秒数,比如waitkey(100)就是等待100毫秒,如果100毫秒没有键盘事件就会继续执行程序。0或负数表示等待无限长时间。
最后用函数destroywindow()来让窗口自行销毁。
- 库文件配置:
- 运行效果如下:
② 播放视频
- 视频获取方式:
*.mp4
文件可以通过 “电脑录屏软件”录制。
视频播放代码如下:
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;
int main(int argc, char** argv) {
namedWindow("test", WINDOW_AUTOSIZE);
VideoCapture cap;
cap.open("猫和老鼠.mp4");
Mat frame;
for (;;) {
cap >> frame;
if (frame.empty())break;
imshow("test", frame);
if (waitKey(33) >= 0)break;
}
return 0;
}
上述代码运行后,不会出现视频,且调试模式下 cap.open("猫和老鼠.mp4")
返回结果为 false
。
*.mp4
视频文件无法播放问题解决方案:
将 "opencv_videoio_ffmpeg490_64.dll"
和"opencv_videoio_msmf490_64d.dll"
两个动态库放到 exe
目录下。
- 运行效果如下:
③ 打开摄像头
int main(int argc,char** argv)
{
cv::namedWindow("test", cv::WINDOW_AUTOSIZE);
cv::VideoCapture cap;
if (argc == 1) {
cap.open(0);
}
else {
cap.open(argv[1]);
}
if (!cap.isOpened()) {
std::cerr << "could not open capture" << std::endl;
return -1;
}
cv::waitKey(0);
return 0;
}
备注:
-
同一个对象可以读取时从文件也可以连接摄像头。
-
连接一个摄像头(
cap.open()
)需要给它一个相机ID号(如果只有一个摄像头连接,这个ID通常为0),ID的默认值为-1,这意味着随意选择一个。
④ 播放摄像头
播放代码如下:
#include <opencv2/opencv.hpp>
int main()
{
//窗口自适应
cv::namedWindow("Capture", cv::WINDOW_AUTOSIZE);
cv::VideoCapture cap;
//打开第一个摄像头
cap.open(0);
cv::Mat frame;
for (;;)