OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux,Windows,Mac等操作系统上。
它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
在系统中安装了Opencv库后,我们就可以通过引入头文件的方式使用OpenCv中的各种算法,用于计算机视觉以及图像处理。
安装OpenCV的过程很复杂,可能会多次失败。建议有耐心多试几次。
下载地址:https://github.com/opencv/opencv/releases
github网站访问有时候很卡,有能力的可以使用魔法上网。
下载好后,可以在文件夹中看见被下载好的压缩包文件(我的是在当前用户目录下)
在终端打开该路径,使用指令解压:
unzip opencv_4.x.zip
解压缩后可以看见文件夹。
sudo apt-get cmake
下载完成后,在进入之前解压的文件夹,创建并进入一个build文件夹。
cd opencv_4.x
mkdir build
cd build
使用以下指令配置cmake:
cmake -DCMAKE_BUILD_TYPE=Release \
-DOPENCV_GENERATE_PKGCONFIG=ON \
-DCMAKE_INSTALL_PREFIX=/usr/local ..
这里我参考了博客:https://blog.csdn.net/spiremoon/article/details/105812303
之前我照着老师给的参考博客进行下载,在完成所有安装操作后,输入打印OpenCv版本的指令时会提示以下报错:
Package opencv4 was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv4.pc’
to the PKG_CONFIG_PATH environment variable
原因是在完成安装后,OpenCv没有生成Opencv4.pc文件。在OpenCv4以前的版本是会自动生成该文件的。到了4版本,OpenCv默认不会自动生成.pc文件。因此在配置cmake时一定要带上如下参数:
-DOPENCV_GENERATE_PKGCONFIG=ON
表示开启生成配置文件的功能。
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev
在这一步可能会出现问题,出现报错:“Unable to locate package libjasper-dev”
我最开始以为是Ubuntu镜像源的问题,于是我参考了以下博客,更换了Ubuntu的镜像源。
原博客:https://blog.csdn.net/laoluobo76/article/details/108302191
使用以下指令,将下载源替换成清华大学镜像:
sudo sed -i "s@http://.*archive.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list
sudo sed -i "s@http://.*security.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list
但是替换镜像源后依旧会继续报错。因此我又再网上搜索了很久,找到了这篇博客:
https://blog.csdn.net/qq_44830040/article/details/105961295
按照这篇博客的说法,我执行了以下指令:
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
于是libjasper-dev也成功下载了。
在build下,使用以下指令进行编译:
sudo make
输入指令后,会看到程序从0%开始进行编译。现在要做的是等待编译完成。这个过程非常长。想要加快速度,可以这样打:
sudo make -4j
这是使用4个线程进行编译,可以一定程度上加快编译速度。
但是笔者在使用该指令的时候出现了问题。在编译途中提示部分指令执行失败,然后整个虚拟机进入卡死状态,并在几分钟后恢复正常并提示编译失败。笔者重复试验了好几次都是这样。因此如果你使用多线程编译出现跟我一样的情况时,请老老实实使用原始指令编译。
在编译完成后,使用指令:
sudo make install
完成安装。
环境配置的过程参照了此博客:https://blog.csdn.net/ssj925319/article/details/109231145
原博客的OpenCV是3版本的,但是在配置环境这一点两个版本之间几乎没有什么区别。
修改 opencv.conf 文件,添加 opencv 库的安装路径:/usr/local/lib。这个路径是配置cmake的时候配置的。
执行以下指令:
sudo gedit /etc/ld.so.conf.d/opencv.conf
填入/usr/local/lib并保存退出。
更新系统共享链接库:
sudo ldconfig
配置 bash ,修改 bash.bashrc 文件,在文件末尾加上这一段:
![opencv4_v_name](E:\学习资料\嵌入式作业\02_函数库与opencv\02_02_opencv\opencv4_v_name.png)sudo gedit /etc/bash.bashrc #打开文件
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
#文件末尾追加这些东西
保存退出,然后执行如下命令使得配置生效:
source /etc/bash.bashrc
sudo updatedb
最后查看OpenCV4版本号,如果能够查看成功,说明OpenCV安装并配置成功。
输入以下指令:
pkg-config --modversion opencv4
注意,这里与原博客不一样,这里OpenCV4生成的cp文件名是“opencv4”,而不是旧版本的“opencv”。因此注意不要打错。如果打成opencv,那么会报Package opencv was not found in the pkg-config search path。如果在cmake配置时没有开启生成pc功能,那么就会报上文所提及的错误。
之所以会报Package xxx was not found in the pkg-config search path,是因为在pkg-config search path下没有找到你输入的包名xxx。要么你输错名字(opencv与opencv4),要么没生成pc文件。
下面几张图,我通过修改cp文件名字,模拟需要的cp文件不存在,验证报错原因。
创建好项目路径,在路径下创建一个cpp文件。
vim test.cpp
这里有一段代码,用于将图像灰化。在test.cpp中粘贴下面这段代码:
#include
#include
using namespace std;
using namespace cv;
Mat src, gray;
int main()
{
src = imread("mopemope.jpeg");//这里是你的图片
if (src.empty())
{
cout << "没有读取到图像" << endl;
return -1;
}
gray.create(row, col, CV_8UC1);
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
gray.at(i,j)= src.at(i, j)[0] * 0.144 +src.at(i, j)[1] * 0.587 + src.at(i, j)[2] * 0.299;
}
}
imwrite("test.jpg", gray);//这里是你的输出
waitKey(0);
return 0;
}
根据你写的文件路径,在对应的位置准备相应的图片文件(我这里是当前路径下,一张名为mopemope的jpeg文件)
然后输入以下指令:
g++ `pkg-config --cflags opencv4` test.cpp `pkg-config --libs opencv4` -o test.out
就可以看见生成了可执行文件。
注意,笔者在编译成功之前也有尝试按照https://blog.csdn.net/ssj925319/article/details/109231145中的指令进行编译,即在g++ .cpp -o .out指令后面加上pkg-config --cflags opencv4
:
g++ test.cpp -o test.out `pkg-config --libs opencv4`
但是不知道为什么会报错,如下图所示:
笔者还暂未找到原因,希望有大佬能够指点迷津!如果你也是和我一样的小白的话,建议用最开始我成功的那条指令编译。
现在执行以下可执行文件,看见已经生成了新的图片,效果是根据彩色图片生成灰度图片。
先生买朵小花吧()
参照https://blog.csdn.net/ssj925319/article/details/109231145
使用快捷键 Win + R ,输入 services.msc ,并回车。
找到程序VMware Authorization Service,确保已经启动。
进入VMware应用,找到虚拟机设置选项,虚拟机->设置->硬件->usb兼容性调usb3.0以上;选择 “ 虚拟机 ” ,再选择 “ 可移动设备 ” ,再选择 “ IMC NetWorks USB2.0 HD UVC WebCam ” ,最后点击 “ 连接 ” ,再弹出的窗口内点击 “ 确定 ” 。
此时再看虚拟机右下角的这个图标有没有绿点,有的话说明已经成功了。
创建一个新的cpp文件:
vim main.cpp
在文件中输入以下代码:
#include
using namespace cv;
int main()
{
//从摄像头读取视频
VideoCapture capture("cat.mp4");
//循环显示每一帧
while(1){
Mat frame;//定义一个Mat变量,用于存储每一帧的图像
capture >> frame;//读取当前帧
if(frame.empty())//播放完毕,退出
break;
imshow("读取视频帧",frame);//显示当前帧
waitKey(30);//掩饰30ms
}
system("pause");
return 0;
}
和图像处理一样编译:
g++ `pkg-config --cflags opencv4` main.cpp `pkg-config --libs opencv4` -o main.out
根据你写的路径(我这里是当前目录)保存一个同名视频:
执行可执行文件,系统播放视频:
首先创建好源代码文件
vim test.cpp
在里面打上这些代码:
/*********************************************************************
打开电脑摄像头,空格控制视频录制,ESC退出并保存视频RecordVideo.avi
*********************************************************************/
#include
#include
#include
#include
using namespace cv;
using namespace std;
int main()
{
//打开电脑摄像头
VideoCapture cap(0);
if (!cap.isOpened())
{
cout << "error" << endl;
waitKey(0);
return 0;
}
//获得cap的分辨率
int w = static_cast(cap.get(cv::CAP_PROP_FRAME_WIDTH));
int h = static_cast(cap.get(cv::CAP_PROP_FRAME_HEIGHT));
Size videoSize(w, h);
VideoWriter writer("RecordVideo.avi", cv::VideoWriter::fourcc('M', 'J', 'P', 'G'),25, videoSize);
Mat frame;
int key;//记录键盘按键
char startOrStop = 1;//0 开始录制视频; 1 结束录制视频
char flag = 0;//正在录制标志 0-不在录制; 1-正在录制
while (1)
{
cap >> frame;
key = waitKey(100);
if (key == 32)//按下空格开始录制、暂停录制 可以来回切换
{
startOrStop = 1 - startOrStop;
if (startOrStop == 0)
{
flag = 1;
}
}
if (key == 27)//按下ESC退出整个程序,保存视频文件到磁盘
{
break;
}
if (startOrStop == 0 && flag==1)
{
writer << frame;
cout << "recording" << endl;
}
else if (startOrStop == 1)
{
flag = 0;
cout << "end recording" << endl;
}
imshow("picture", frame);
}
cap.release();
writer.release();
destroyAllWindows();
return 0;
}
编译一下:
g++ `pkg-config --cflags opencv4` test.cpp `pkg-config --libs opencv4` -o test.out
运行效果:
如果有以下报错:
请查看虚拟机->设置->硬件->usb兼容性是否调的是usb3.0以上,不是的话先调成3.0以上,再重新在虚拟机->可移动设备->IMC NetWorks USB2.0 HD UVC WebCam重新连接,虽然usb兼容性是否调的是usb3.0以上但是也报这个错的话也试试重新在连接IMC NetWorks USB2.0 HD UVC WebCam。
退出录制后,在相对应的路径留下视频。