本文目录
一.在ubantu 16.4下安装opencv-3.4.1
1.将下载的opencv压缩包放入home目录下进行解压配置
(1)进入命令行模式,输入以下命令进行解压
$unzip opencv-3.4.1.zip
(2)进入解压后的文件包
$cd opencv-3.4.1
(3)安装依赖库和cmake,执行如下命令:
sudo apt-get install cmake
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev
(4)安装完cmake之后执行命令 ,创建编译文件夹,进入文件夹进行配置
(5)cmake一下并执行命令
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
sudo make -j4
下载完成:
2.执行命令
sudo make install
编译过程结束,接下来我们配置编程环境
使用命令sudo gedit /etc/ld.so.conf.d/opencv.conf,然后会打开一个空白文件,输入/usr/local/lib即可
点击保存,然后执行如下命令sudo ldconfig,配置bash: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
至此,所有配置已完成。
二.编写一个打开图片进行特效显示的代码 test1.cpp
1.在opencv-3.4.1下新建文件夹mytest
2.创建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("lena.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;
}
保存并且进行编译
gcc test.cpp -o test `pkg-config --cflags --libs opencv`
将图片改名为lena.jpg,放入mytest文件中,然后使用命令./test执行
即可完成对图片的编辑。
三.编写一个打开摄像头显示处理视频的程序代码。
1.编写代码打开摄像头
在mytest目录下,用编辑器写入camera.cpp,程序如下:
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
VideoCapture capture(0);
while(1)
{
Mat frame;
capture >> frame;
imshow("读取视频帧",frame);
waitKey(30);
}
system("pause");
return 0;
}
然后在命令行输入:
g++ camera.cpp -o camera `pkg-config --cflags --libs opencv`
./camera
若出现如下错误:
请注意打开如下连接主机
即可打开摄像头了
然后在命令行按ctrl加c即可退出
2.编写代码打开视频
(1)首先下载一个视频,然后放入mytest目录当中:
将上述代码第七行改为:
VideoCapture capture("vedio.mp4");
即可播放视频了!
问题:
在第9行的while循环中,Mat是一个什么数据结构? 为什么一定要加一句waitKey延时代码,删除它行不行?
该代码中Mat是一个类,waitKey这个命令控制着imshow的持续时间。删除它会导致没时间去展示图像。
我们发现视频只能按ctrl加c才能退出,改变程序如下即可:
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
VideoCapture capture("ps.mp4");
int key;
while(1)
{
Mat frame;
capture >> frame;
key = waitKey(100);
if (key == 27)
{
break;
}
imshow("读取视频帧",frame);
waitKey(30);
}
system("pause");
return 0;
}
3.摄像头代码改进版:
代码如下,能打开摄像头采集图像并保存
#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;
}
其运行结果如下所示:
发现可以按住空格保存图像,然后按照esc即可退出界面。