目录
1.1如果要求打开你硬盘上一个视频文件来播放,请问示例代码1第7行代码如何修改?
1.2在示例代码1第9行的while循环中,Mat是一个什么数据结构? 为什么一定要加一句waitKey延时代码,删除它行不行?
1.3示例代码1代码会在while循环中一直运行,你如果试图用鼠标关闭图像显示窗口,会发现始终关不掉。需要用键盘Ctrl+C 强制中断程序,非常不友好。如何改进?
三. 每一个程序背后都站着一堆优秀的代码库。通过学习opencv图像库编程,了解如何借助第三方库函数完成一个综合程序设计。“学了opencv,妈妈再不担忧你不会图像编程啦!”。
在VMware虚拟机Ubuntu系统下练习编译、安装著名的C/C++图像处理开源软件库 Opencv3.x 。安装成功后:
1. 编写一个打开图片进行特效显示的代码 test1.cpp(见opencv编程参考资料 );
注意gcc编译命令: gcc test1.cpp -o test1 `pkg-config --cflags --libs opencv`
请解释这条编译命令,它是如何获得opencv头文件、链接lib库文件的路径的?
2. 练习使用opencv库编写打开摄像头压缩视频的程序。参考示例代码1和示例代码2。并回答:
1)如果要求打开你硬盘上一个视频文件来播放,请问示例代码1第7行代码如何修改?
2)在示例代码1第9行的while循环中,Mat是一个什么数据结构? 为什么一定要加一句waitKey延时代码,删除它行不行?
3)示例代码1代码会在while循环中一直运行,你如果试图用鼠标关闭图像显示窗口,会发现始终关不掉。需要用键盘Ctrl+C 强制中断程序,非常不友好。如何改进?
一、安装opencv
1.1 安装cmake
终端执行下面语句,安装cmake
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 下载opencv3
(opencv4下面的安装方法可能不好使了就)
下载地址:Releases - OpenCV
点击Sources进行下载自己需要的版本
2. 安装
2.1 解压文件
解压后,将文件夹放自己喜欢的地方,我就放在了主目录~下
2.2 进入到解压后的文件夹下
(这里我将解压后的文件夹重新命为opencv3,这个随便,不是重点)
在opencv3文件夹下新建build文件夹
终端运行
mkdir build
进入build文件夹下
cd build
2.3 进行cmake
在build目录下运行
sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
2.4 进行编译
接下来时一个漫长的等待过程,大概需要等30分钟,看运气,不要多虑
sudo make -j8
可以使用sudo make -j 8
、sudo make -j4
、sudo make加快速度
我这里就使用sudo make -j 8了
2.5 进行安装
再执行
sudo make install
3. 配置环境
3.1 修改ld.so.conf文件
用gedit打开/etc/ld.so.conf
在文件中加上一行 /usr/loacal/lib
其中/user/loacal
是opencv安装路径也就是makefile中指定的安装路
终端执行
sudo gedit /etc/ld.so.conf
输入:
include /usr/local/lib
保存退出,运行下面语句刷新库链接配置
sudo ldconfig
3.2 修改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
如图所示,出现版本号就安装成功了。
二、编写一个打开图片进行特效显示的代码
1.在opencv3.4.1下新建mytest文件夹
mkdir mytest
cd mytest
2.创建test.cpp
vim 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("test1.png");
//这里的test1.png是指原图片(待处理图片)
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("test2.jpg", src);
//test2.jpg是处理后的图片
cvNamedWindow("test",1); imshow("test", src);
cvWaitKey();
return 0;
}
使用:wq
保存并退出
注:文件和图片要放在同一目录下
3.用g++编译
g++ test.cpp -o test `pkg-config --cflags --libs opencv`
4.运行test
./test
三、编写一个打开摄像头显示处理视频的程序代码
1.参考代码1(最简语句版)
#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
//从摄像头读取视频
VideoCapture capture(0);
//循环显示每一帧
while(1)
{
Mat frame; //定义一个mat变量,用于存储每一帧图像
capture >> frame; //读取当前帧
imshow("视频读取帧",frame); //显示当前帧
waitKey(30); //延时30ms
}
system("puase");
return 0;
}
1.1如果要求打开你硬盘上一个视频文件来播放,请问示例代码1第7行代码如何修改?
第7行要改为VideoCapture capture(“视频名.mp4”);
1.2在示例代码1第9行的while循环中,Mat是一个什么数据结构? 为什么一定要加一句waitKey延时代码,删除它行不行?
Mat是一个矩阵,用来存放一帧图片的像素点,每个像素点对应一个RGB值,可以显示当前像素色块。
读帧时做一定延时是为了达到正常播放,据统计每秒显示 27、28帧时,是视频播放的最好状态。如果没有延时,那么运行后画面马上就消失了,还没看到画面就没了。所以waitKey函数必不可少,最好延时30ms左右
1.3示例代码1代码会在while循环中一直运行,你如果试图用鼠标关闭图像显示窗口,会发现始终关不掉。需要用键盘Ctrl+C 强制中断程序,非常不友好。如何改进?
此代码会在while循环中一直运行,你如果试图用鼠标关闭图像显示窗口,会发现始终关不掉。需要在终端用键盘Ctrl+C 强制中断程序,如果想要退出,可以在延时后面加一个break代码,如if(key == 27) break;//按下ESC退出整个程序
2.参考代码2(改进版,打开摄像头采集图像并保存)
创建一个 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;
}
编译 test3.cpp 文件
g++ test3.cpp -o test3 `pkg-config --cflags --libs opencv`
输出结果
./test3
至此,OpenCV的安装和使用就大功告成了,OpenCV 的许多功能可以百度一下。
四、总结
在VMware虚拟机Ubuntu系统下安装OpenCV耗费了太多的时间,光是下载就下载了快一个小时,什么时候国家能解除一点网络墙,或者建立以下镜像网站也行啊,每次去外网搜文献下载文件都要看运气