- 一. 图像处理
- 二. 视频处理
opencv的安装:
- ubuntu安装opencv的正确方法_陶陶name-CSDN博客_ubuntu安装opencv
- 官网:在乌本图 18.04 |安装 OpenCV 3.4.4学习开放CV (learnopencv.com)
使用环境:
- ubuntu18.04 desktop
- opencv 3.4.15
- 编写代码
- 创建目录Code,并进入此目录
- 保存或下载一张图片于此目录
linux下对图片格式是有要求的。最好不要使用百度下的图片链接,因为图片格式很大可能存在问题,致使在linux系统打不开。因此,建议使用专业下载图片网站的链接。
wget https://cdn.pixabay.com/photo/2014/05/03/00/56/summerfield-336672_960_720.jpg //此次操作我没使用这个图片,不过我验证过这张图片是是可以的。
下载完图片可以更改名字
mv summerfield-336672_960_720.jpg summerfield.jpg
- 编写代码保存为 test1.cpp
vim test1.cpp
更改代码中图片名称为你保存或下载的图片名称 例如 summerfield.jpg
#include#include using namespace cv; using namespace std; int main(int argc, char** argv) { CvPoint center; double scale = -3; IplImage* image = cvLoadImage("liqin.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;Mat dst; src = cvarrToMat(image); cv::imwrite("test.png", src); cvNamedWindow("test",1); imshow("test", src); cvWaitKey(); return 0; }
- 编译代码
//这是错误的,gcc只能编译C文件,不能编译cpp文件 gcc test1.cpp -o test1 `pkg-config --cflags --libs opencv` //这是正确的 g++ test1.cpp -o test1 `pkg-config --cflags --libs opencv`
`(反引号): 命令替换
pkg-config :库信息提取工具 。–cflags --libs为此工具的参数 。–cflags 编译所需,–libs链接所需。
pkg-config --cflags --libs opencv:编译链接所需的opencv库
编译文件
- 输出结果
./test1二. 视频处理
(1) 虚拟机获得摄像头权限。
- 菜单栏点击 虚拟机,再点击 设置
- 点击usb控制器,将usb 2.x跟改为3.x。更改后,点击下方确定。
- 菜单栏点击 虚拟机 -> 可移动设备 -> ………… -> 连接。 弹出窗口再点击确定。
出现绿色小圆点,表示连接成功。
(2)播放视频
如果出现这种问题导致播放不了mp4等格式视频的
MPEG-4 AACdecoder, H.265(Main Profile)decoder are required to play the file, but are not installed。
可以选择安装 ubuntu-restricted-extras 。该软件包使用户能够安装播放流行的非免费媒体格式的功能,包括DVD,MP3,Quicktime和Windows Media格式
sudo apt-get install ubuntu-restricted-extras
- 创建文件 test2.cpp。先准备一个视频,更改代码中视频名称。
这里我就不提供视频下载链接了。下载方法就是 wget + 视频链接
初始代码: 后面会进行优化
#includeusing namespace cv; int main() { //从文件中读取视频。若参数为0,表示调用摄像头采集视频。 VideoCapture capture("鹿晗-勋章.mp4"); //视频路径及名称 //循环显示每一帧 while(1){ Mat frame;//定义一个Mat变量,用于存储每一帧的图像 capture >> frame;//读取当前帧 if(frame.empty())//播放完毕,退出 break; imshow("读取视频帧",frame);//显示当前帧 waitKey(30);//延时30ms } system("pause"); return 0; }
代码详解:
-
VideoCapture:使用该类创建视频捕获对象,调用摄像头采集视频或从文件中读入视频。当对象参数为0,如VideoCapture capture(0),则表示调用摄像头采集视频。
-
Mat:图像存储数据结构。
-
waitKey():这个函数是在一个给定的时间内(单位ms)等待用户按键触发;如果用户没有按下键,则接续等待。如果为0,程序无限期等待。这个函数必须要有。如果没有,不会报错,但是不会出现窗口,因为没有延时(会非常短暂)。
- 编译文件test2.cpp。并输出结果。
g++ test2.cpp -o test2 `pkg-config --cflags --libs opencv` ./test2
我们发现有很多问题,比如:
-
视频窗口大小无法调整:窗口属性设置为 WINDOW_NORMAL 即可
-
窗口无法正常关闭:查看我的另一篇文章即可。opencv无法通过窗口按钮关闭窗口的解决办法_diyu-CSDN博客
那么改进代码如下:
#includeusing namespace cv; int main() { //从文件中读取视频。若参数为0,表示调用摄像头采集视频。 VideoCapture capture("鹿晗-勋章.mp4"); //视频路径及名称 //循环显示每一帧 while(1){ Mat frame;//定义一个Mat变量,用于存储每一帧的图像 capture >> frame;//读取当前帧 if(frame.empty())//播放完毕,退出 break; namedWindow("读取视频帧",WINDOW_NORMAL); //绘制窗口 imshow("读取视频帧",frame); //显示当前帧 waitKey(30);//延时30ms //判断是否点击窗口关闭按钮 if( getWindowProperty("读取视频帧",WND_PROP_AUTOSIZE) != 0) break; } //system("pause"); linux里此命令无法使用 capture.release(); //释放对象 destroyAllWindows(); //关闭窗口 return 0; }
(3)录制视频
创建文件 test3.cpp
test3.cpp
#include#include #include #include 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 (cap.get(CV_CAP_PROP_frame_WIDTH)); int h = static_cast (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
生成一个avi文件,并不断生成帧。
总结:
学习opencv一定要学会去看官方文档,即使是英文。
网上学习我推荐官网,教材学习 LearningOpenCV 3 或者 opencv3编程入门(毛星云)。
搞这玩意的时候,又回到当初初学linux的时候,什么都搞一下,然后系统崩了,还总是忘记拍快照,哎。
当然,放心,只要不乱来,不会崩的。



