目录
一、基于Ubuntu下安装opencv
1、opencv依赖环境的安装
1.1 安装cmake
首先,打开Ubuntu虚拟机,打开中端,输入一下命令行。
sudo apt-get install cmake
1.2 依赖环境的安装
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev
sudo apt-get install libgtk2.0-dev
sudo apt-get install pkg-config
1.3 下载opencv
首先,打开虚拟机,在虚拟机浏览器上输入Releases - OpenCV 选择对应的opencv版本。
注:下载opencv时,由于网络原因,可能下载会很慢,可以选择国内快速下载地址:OpenCV/opencv_contrib国内快速下载 | 绕云技术博客
2、压缩包的安装
2.1 文件解压
选择下载好的压缩包,将压缩包解压到对应的文件夹中(可以自己选择,无定性要求)
2.2 安装包程序安装
打开已解压的压缩包,构建一个build文件
mkdir build
打开build文件夹
cd build
输入下面代码进行安装
sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
等待安装。
2.3 进行编译
sudo make -j8
可以使用sudo make -j 8 、sudo make -j4 、sudo make
注:这里所需要的时间较长,耐心等待,如果出现虚拟机卡死的情况,关闭虚拟机,在重新操作即可。
2.4 进行安装
sudo make install
3、相关环境的配置
用gedit打开/etc/ld.so.conf
在文件中加上一行 /usr/loacal/lib
其中/user/loacal是opencv安装路径也就是makefile中指定的安装路
sudo gedit /etc/ld.so.conf
结果如下图:(该图为引用结果)
运行sudo ldconfig,
修改bash.bashrc文件
sudo gedit /etc/bash.bashrc
在文件末尾加入:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
(引用图)
然后输入
source /etc/bash.bashrc
4、检验
pkg-config opencv --modversion
结果如下:
说明opencv安装成功。
二、相关操作之图片
1、代码编写
首先创建一个代码存放文件夹 code ,然后进入文件夹中打开中端。
gedit test1.cpp
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
CvPoint center;
double scale = -3;
IplImage* image = cvLoadImage("myp.jpg");
argc == 2? cvLoadImage(argv[1]) : 0;
cvShowImage("Image", image);
if (!image) return -1; center = cvPoint(image->width / 2, image->height / 2);
for (int i = 0;i<image->height;i++)
for (int j = 0;j<image->width;j++) {
double dx = (double)(j - center.x) / center.x;
double dy = (double)(i - center.y) / center.y;
double weight = exp((dx*dx + dy*dy)*scale);
uchar* ptr = &CV_IMAGE_ELEM(image, uchar, i, j * 3);
ptr[0] = cvRound(ptr[0] * weight);
ptr[1] = cvRound(ptr[1] * weight);
ptr[2] = cvRound(ptr[2] * weight);
}
Mat src;Mat dst;
src = cvarrToMat(image);
cv::imwrite("test.png", src);
cvNamedWindow("test",1); imshow("test", src);
cvWaitKey();
return 0;
}
注:在进行代码输入时,需要将对应代码中的文件名改为自己文件的名字。
2、编译文件
g++ test1.cpp -o test1 `pkg-config --cflags --libs opencv`
解释:
gcc编译器:gcc + 文件名 + -o + 输出文件流名称 +` 支持包
在同一文件夹下准备一张图片,文件名为:myp.jpg
3、输出结果
./test1
如果出现问题,可以参考下述参考链接(导致的原因可能是由于opencv对应的库文件未正确配置)
三、相关操作之视屏
1、配置Ubuntu摄像头
2、视屏的播放
2.1 代码编写
具体操作如上,这里就只附上对应代码了。
gedit test2.cpp
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
//从摄像头读取视频
VideoCapture capture("myv.avi");
//循环显示每一帧
while(1){
Mat frame;//定义一个Mat变量,用于存储每一帧的图像
capture >> frame;//读取当前帧
if(frame.empty())//播放完毕,退出
break;
imshow("读取视频帧",frame);//显示当前帧
waitKey(30);//掩饰30ms
}
system("pause");
return 0;
}
代码讲解:
如果语句:VideoCapture capture(0),后面的参数设置为 0 ,则从摄像头读取视频并循环显示每一帧;如果设置为一个视频的文件名,比如:man.mp4 ,则会将视频读取并循环显示每一帧。
while 循环体中的 Mat 数据结构其实是一个点阵,对应图像上的每一个点,点的集合形成了一帧图像,有关 Mat 详解请看:OpenCV中Mat数据结构
语句:waitKey(30) ,中的参数单位是 ms 毫秒,也就是每一帧间隔 30 ms ,该语句时不能删除的,否则会执行错误,无法播放视频或录制视频。
如果要求打开你硬盘上一个视频文件来播放,第5行代码应修改为:
VideoCapture capture("xxxx.mp4"); //已上传的文件名
在第6行的while循环中Mat是一个类,由两部分数据组成:矩阵头(包括矩阵尺寸、存储方法、存储地址等信息)和一个指向所有像素值的矩阵(根据所选存储方法不同,矩阵可以是不同的维数)的指针。
waitkey这个命令控制着imshow的持续时间,当imshow之后不跟waitkey时,相当于没有给imshow提供时间展示图像,就只有一个空窗口一闪而过,所以必须加waitkey。
2.2 编译 test2.cpp 文件
g++ test2.cpp -o test2 `pkg-config --cflags --libs opencv`
2.3 输出结果
./test2
3、视屏的录制
3.1 编写代码
gedit test3.cpp
test3.cpp:
/*********************************************************************
打开电脑摄像头,空格控制视频录制,ESC退出并保存视频RecordVideo.avi
*********************************************************************/
#include<iostream>
#include <opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
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<int>(cap.get(CV_CAP_PROP_FRAME_WIDTH));
int h = static_cast<int>(cap.get(CV_CAP_PROP_FRAME_HEIGHT));
Size videoSize(w, h);
VideoWriter writer("RecordVideo.avi", CV_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;
}
此代码会在while循环中一直运行,你如果试图用鼠标关闭图像显示窗口,会发现始终关不掉。需要用键盘Ctrl+C 强制中断程序,非常不友好。改进方法如下:
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
VideoCapture capture(0);
int key;
while(1)
{
Mat frame;
capture >> frame;
key = waitKey(100);
if (key == 27)
{
break;
}
imshow("读取视频帧",frame);
waitKey(30);
}
system("pause");
return 0;
}
3.2 编译 test3.cpp 文件
g++ test3.cpp -o test3 `pkg-config --cflags --libs opencv`
3.3 输出结果
./test3
录制视屏时,按下空格开始,按ESC结束
生成了一个AVI格式视屏。
更多 OpenCV 的学习教程可以参考:OpenCV教程:超详细的OpenCV入门教程,值得收藏!
四、总结
在本次实验中,opencv的安装可谓是花费了我绝大数时间。其中,我也遇到了雨多问题,但在我的不懈努力以及多方面的查阅资料下,我最终还是成功的安装了opencv。至于opencv的相关操作,在网上前辈的帮助下,我也较为顺利的完成了本次实验。
五、参考资料
ubuntu安装opencv的正确方法_陶陶name-CSDN博客_ubuntu安装opencv
Ubuntu18.04下OpenCV3.4.11的安装及使用示例_ssj925319的博客-CSDN博客