一、安装opencv的准备工作
1.安装cmake
sudo apt-get install cmake
2.安装依赖环境
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev
在安装依赖环境时,我遇到了个问题,就是要求更换介质。 输入
cd ~
vim /etc/apt/sources.list
注释掉开头第一行,deb cdrom就行 然后更新一下
apt-get uodate
现在安装依赖环境应该就不会出现问题了。
二、安装opencv
1.下载opencv 链接: https://www.bzblog.online/wordpress/index.php/2020/03/09/opencvdownload 进入后选择需要的版本,点进去如下,下载最后一个压缩包。(建议下载3.4.xx版本的,下更新的版本安装容易出错) 解压前,将下载的文件复制的自己想要的目录下,再进行提取文件,也就是解压。 2.鼠标右击opencv-3.4.11,点击在终端打开,然后建立build文件夹并进入该文件夹
mkdir build
cd build
3.通过cmake安装opencv 输入以下代码:
sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
稍等一会儿,等停止后进行编译,在这有几种方法,主要体现在安装速度不一样。
可以使用sudo make -j 8 、sudo make -j4 、sudo make
我这里使用了·sudo make ,避免线路多了出错。
接下来又是漫长的等待,直到安装到100%。
最后进行安装,输入下述代码
sudo make install
4.配置环境 打开/etc/ld.so.conf
sudo gedit /etc/ld.so.conf
在文件最后一行加上include /uer/local/lib。点击保存。此时显示有隐患,问题不大,不用管。 运行sudo ldconfig, 修改bash.bashrc文件
sudo ldconfig
sudo gedit /etc/bash.bashrc
在文件末尾加入: PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig export PKG_CONFIG_PATH 然后输入
source /etc/bash.bashrc
最后检查一下
pkg-config opencv --modversion
这就安装成功了。
三、使用opencv进行图片的特效显示
1.创建一个text3文件夹,用于保存本次的文件。
mkdir text3
cd text3
2.进入文件夹后编写程序test.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("star.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;
src=cvarrToMat(image);
imwrite("test.png",src);
imshow("test",src);
cvWaitKey();
return 0;
}
2.编译程序 使用命令
gcc test.cpp -o test `pkg-config --cflags --libs opencv`
此时会报错,改为
g++ test.cpp -o test `pkg-config --cflags --libs opencv`
这条命令通过命令pkg-config --cflags --libs opencv获取 反引号表示输出字符串,所以使用g++ test.cpp -o test pkg-config --cflags --libs opencv 编译程序时首先会将pkg-config --cflags --libs opencv替换为如下的OpenCV头文件和库文件的路径,从而获取OpenCV头文件、链接lib库文件的路径。 使用./test后,运行结果如下。
四、使用opencv对视频进行处理
1.使用电脑摄像头读取视频并显示程序如下 video.cpp
#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
char key;
VideoCapture capture(0); //从摄像头读取视频
while(1) //循环显示每一帧形成视频
{
Mat frame; //定义Mat变量储存每一帧图像
capture>>frame; //读取当前帧
imshow("读取视频",frame); //显示当前帧
waitKey(30); //延时
}
return 0;
}
2.使用电脑摄像头录制视频程序 video_record.cpp
/*********************************************************************
@名字:video_record
@功能:使用电脑摄像头录制视频
@按键:空格视频录制,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 capture(0); //打开电脑摄像头
if (!capture.isOpened())
{
cout << "error" << endl;
waitKey(0);
return -1;
}
int w = static_cast<int>(capture.get(CV_CAP_PROP_FRAME_WIDTH)); //获得capture的分辨率
int h = static_cast<int>(capture.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)
{
capture >> frame;
key = waitKey(100);
if (key == 32) //按下空格开始录制、暂停录制
{
startOrStop =1-startOrStop;
if (startOrStop == 0) flag = 1; //可以来回切换
}
if (key == 27) break; //按下 ESC 退出整个程序,保存视频文件到磁盘
if (startOrStop == 0 && flag==1)
{
writer << frame;
cout << "recording" << endl;
}
else if (startOrStop == 1 && flag==1)
{
flag = 0;
cout << "pause recording" << endl;
}
imshow("picture", frame);
}
capture.release();
writer.release();
destroyAllWindows();
}
3.Ubuntu下使用摄像头 快捷键win+r打开运行,输入“services.msc”,回车。打开服务器 在服务器列表中,确保“VMware USB Arbitration Service”已打开。 虚拟机设置: 在虚拟机菜单栏中选择“虚拟机(M)”->选择“可移动设备”->选择“xxxx Camera”->选择“连接(断开与主机连接)”,设置完这项之后,虚拟机接管了笔记本摄像头。 在终端输入命令, 安装cheese apt-get install cheese 输入命令cheese查看摄像头情况。 若无视频,在Vmware Workstation的“虚拟机”->“虚拟机设置”->“USB控制器”下,查看“USB兼容性”,如果当前是“USB2.0”就修改为“USB3.0”,反之就修改为“USB2.0”。然后再在“虚拟机”->“可移动设备”下重新连接Camera,cheese就可以正常出视频了。 4.1 如果要读取一个硬盘上的文件,就应将video.cpp中的 VideoCapture capture(0)改为 VideoCapture capture(”as.mp4")。 效果如下 4.2 在video.cpp的while循环中Mat是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸、存储方法、存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同,矩阵可以是不同的维数)的指针。 加入waitKey延时,这样便于刷新储存每一帧图像,不会造成视频卡顿之类的问题。如果不加入延时的话会导致视频显示窗口无法显示。 4.3 video代码会在while循环中一直运行,你如果试图用鼠标关闭图像显示窗口,会发现始终无法关掉。需要用键盘输入Ctrl+C强制中断程序,非常不友好。 可以在while循环里加入按键退出的代码如下(按q键退出)
key = waitKey(1) & 0xff; //按q键退出
if(key == 'q') break;
五、总结及参考
难,就感觉难,很多东西都参考了网上的大神的教程。但是真的很有趣,过程中还是不可避免的问题多多,但处理了就会有较深刻的印象。努力学习吧,争取以后自己也能搞出来,并且还比较好。同时欢迎各位大神指点。 参考: https://blog.csdn.net/public669/article/details/99044895 https://blog.csdn.net/qq_45237293/article/details/109391445 https://blog.csdn.net/ssj925319/article/details/109231145 https://blog.csdn.net/oXiaoXue123456789/article/details/107115584
|