- 一、安装opencv的准备工作
- 二、安装opencv
- 三、使用opencv进行图片的特效显示
- 四、使用opencv对视频进行处理
- 五、总结及参考
一、安装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
现在安装依赖环境应该就不会出现问题了。
二、安装opencv1.下载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
这就安装成功了。
1.创建一个text3文件夹,用于保存本次的文件。
mkdir text3 cd text3
2.进入文件夹后编写程序test.cpp。
#include#include 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 height;i++) for (int j = 0;j 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后,运行结果如下。
1.使用电脑摄像头读取视频并显示程序如下
video.cpp
#includeusing 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
#include#include #include #include 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 (capture.get(CV_CAP_PROP_frame_WIDTH)); //获得capture的分辨率 int h = static_cast (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



