Ubuntu系统下基于Opencv完成图像编程
文章目录
- 一、OpenCV简介
- 二、安装OpenCV
- 2.1 安装包下载
- 2.2 使用cmake安装
- 2.3 配置环境
- 三、使用实例
- 3.1 图片运用
- 3.2 视频运用
- 四、总结
- 五、参考文献
一、OpenCV简介
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提拱了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV用C++语言编写,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令, 如今也提供对于C#、Ch、Ruby,GO的支持。
二、安装OpenCV
安装环境:VMware虚拟机安装的Ubuntu 18.04系统
2.1 安装包下载
下载OpenCV 数据包
在虚拟机中使用浏览器进行下载
搜索官网
选择Github
下滑选择最新版本
右键,提取到一个文件夹存放
完成后如下:
2.2 使用cmake安装
右击OpenCV文件夹,选择在终端打开
首先进入root用户,并更新一下
sudo su
sudo apt-get update
接着执行命令安装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
由于我执行这条语句时,出现了错误:无法覆盖 libjasper-dev ,因为已经存在了,所以我执行这条命令的时候删掉最后一个库:libjasper-dev
在主机中使用 ctrl+c 复制命令,再虚拟机中使用快捷键 ctrl+shift+v 粘贴命令即可,前提是虚拟机安装了 VMware Tools
删掉最后一个库,成功执行上面命令
在创建build文件夹
mkdir build
然后进入我们创建的文件夹
cd build
使用 cmake 编译参数,或者使用第二条默认参数,都可以的。
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
cmake ..
使用make创建编译,任然在build文件夹下进行(漫长的编译过程)
sudo make
编译完成!!
安装
sudo make install
安装过程中没有报错,即可安装完成。
2.3 配置环境
修改 opencv.conf 文件,打开后的文件是空的,添加 opencv 库的安装路径:/usr/local/lib
sudo gedit /etc/ld.so.conf.d/opencv.conf
保存后退出该文件夹,右上角保存并关闭
保存后会看到之前的警告信息,不用担心,正常情况。
更新系统共享链接库
sudo ldconfig
配置 bash ,修改 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
更新一下
sudo updatedb
查看 opencv 的版本信息
pkg-config --modversion opencv
发现报错
因为我们用的是OpenCV4版本,默认不使用pkg-config
参考文献:为什么OpenCV4 “pkg-config --modversion opencv”显示“ No package ‘opencv‘ found”?解决方法!
三、使用实例
3.1 图片运用
首先创建一个代码存放文件夹 ,然后进入文件夹中。
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("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`
gcc编译器:gcc + 文件名 + -o + 输出文件流名称 +` 支持包
编译出错了!!!百度了一下,说是:需要用 C++ 编译器编译你的接口模块。将 gcc 改为 g++ 后就正确了,可以看到有了可执行文件 test ,
在用同文件夹下准备一张图片,文件名为:test.jpeg
输出结果:
./test
可以看到由 lena.jpg 生成了一个 test.png ,呈现的效果不同了
3.2 视频运用
虚拟机获取摄像头权限
使用快捷键 Win + R ,输入 services.msc ,并回车。
找到 VMware USB Arbitration S… 服务,确保启动了
点击 “ 虚拟机 ” ,然后点击 “ 设置(S)… ”
选择 “ USB控制器 ” ,将 “ USB兼容性 ” 设置为 “ USB 3.1 ” ,并点击确定。
选择 “ 虚拟机 ” ,再选择 “ 可移动设备 ” ,再选择 “Acer BisonCarm,NB Pro ” ,最后点击 “ 连接 ” ,再弹出的窗口内点击 “ 确定 ”
虚拟机右下角这个摄像头图标有个小绿点,则连接成功。
播放视频
创建一个test1.cpp文件
代码如下
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{//读取视频VideoCapture capture("sd.mp4");//循环显示每一帧while(1){Mat frame;//定义一个Mat变量,用于存储每一帧的图像capture >> frame;//读取当前帧if(frame.empty())//播放完毕,退出break;imshow("读取视频帧",frame);//显示当前帧waitKey(30);//掩饰30ms}system("pause");return 0;
}
如果语句:VideoCapture capture(0),后面的参数设置为 0 ,则从摄像头读取视频并循环显示每一帧;如果设置为一个视频的文件名,比如:man.mp4 ,则会将视频读取并循环显示每一帧。
while 循环体中的 Mat 数据结构其实是一个点阵,对应图像上的每一个点,点的集合形成了一帧图像,有关 Mat 详解请看:OpenCV中Mat数据构
语句:waitKey(30) ,中的参数单位是 ms 毫秒,也就是每一帧间隔 30 ms ,该语句时不能删除的,否则会执行错误,无法播放视频或录制视频。
准备了一个sd.mp4
编译 test1.cpp 文件
g++ test1.cpp -o test1 `pkg-config --cflags --libs opencv`
输出结果
./test1
录制视频
创建一个test2.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;
}
编译
g++ test2.cpp -o test2 `pkg-config --cflags --libs opencv`
输出结果:
./test2
生成了一个 .avi 文件,并不断生成帧。
四、总结
gcc test1.cpp -o test1 pkg-config --cflags --libs opencv
gcc编译器:gcc + 文件名 + -o + 输出文件流名称 +` 支持包
在test.1cpp代码中,while 循环体中的 Mat 数据结构其实是一个点阵,对应图像上的每一个点,点的集合形成了一帧图像,有关 Mat 详解请看:OpenCV中Mat数据构
五、参考文献
Ubuntu18.04下OpenCV3.4.11的安装及使用示例
Ubuntu系统下基于Opencv完成图像编程相关推荐
- 【嵌入式】在Ubuntu系统下通过OpenCV实现点阵汉字的字模读取与显示
介绍汉字点阵的原理,理解汉字的机内码.区位码编码规则和字形数据存储格式,通过OpenCV在Ubuntu系统下显示点阵汉字 一.汉字点阵原理 1.汉字点阵原理 1.点阵 2.汉字编码 3.点阵字库存储 ...
- Ubuntu系统下python opencv视频采集:使用USB端口映射指定要读取的相机设备
Ubuntu16.04 下 python opencv 视频采集:使用USB端口映射指定要读取的相机设备 有时我们需要读取指定设备的视频流,但笔记本电脑通常自带相机,同时可能连接多个USB相机,每次插 ...
- Ubuntu系统下用gcc和Makefile编程
# 安装Ubuntu 在Windows环境下通过虚拟软件VMware安装Ubuntu https://pan.baidu.com/s/1KAZuW46ObVmIXZeoccs90Q [提取码]:wd5 ...
- Ubuntu系统下查看摄像头参数并基于OpenCV调用
目录 1. 安装v4l-utils 2. 查找连接的摄像头列表 3. 查看各相机支持的分辨率.帧率.像素格式等参数 4. 注意事项 5. OpenCV(C++)调用摄像头代码 本博文描述了在Ubunt ...
- 【嵌入式1】Ubuntu系统下运行C语言程序以及用Makefile方式编程
文章目录 一.设置网络参数 1.虚拟机网络适配器设置为NAT模式 2.确定网卡ip 3.设置NAT网络的端口映射 4.进行网络测试 二.用C语言编写一个简单的输出 hello word 的程序. 三. ...
- 基于虚拟机Ubuntu系统下C语言简单编写程序
目录描述 前言 一.修改系统参数 1.查看Ubuntu版本 2.原文件备份 3.下载清华源 二.编写"hello world"C语言程序 1.安装vim 2.建立hello.c 3 ...
- 基于ubuntu系统下的USB设备绑定
目录 前言 基本原理 实现方法 前言 在Ubuntu系统的使用中,没有对USB进行设备进行绑定的话,每次插拔或者顺序的不同,都会造成ttyUSB端口号的改变,不利于实际应用,一劳永逸地方法就是对其进行 ...
- [基于STM32底盘控制与ROS上层导航小车制作] 第五节 实现STM32与ubuntu系统下的ROS串口DMA通信,传输底盘速度等信息
系列文章目录 第一节 stm32电机驱动与编码器读取反馈 第二节 stm32电机pid控制 第三节 stm32线速度标定 第四节 stm32添加mpu6050得到angle角度 第五节 实现STM32 ...
- ubuntu下c语言编程工具,Ubuntu系统下C语言代码检查工具(Splint)
看一下下面的代码(当然包括错误,以检验splint的功能): #include int main(int argc,char* argv[]){ int a=100; /*没有使用的变量*/ int ...
最新文章
- 计算机IP地址与子网掩码如何进行AND运算
- 同时打开多个VC工程
- 滑动轨迹 曲线 python_python – 计算轨迹(路径)中的转折点/枢轴点
- 河北大学计算机专业调剂,【计算机考研调剂】河北大学2021级硕士研究生预调剂信息统计的通知...
- 利用机器学习进行金融数据风险评估
- C++算法学习(力扣:1003. 检查替换后的词是否有效)
- UI动画的一些制作过程
- 完善的WebGis地图编辑器
- WindowsServer2008R2系统版本升级
- 【转】解决win10系统每次重启桌面图标排列混乱的问题!亲测有效!!
- python面向对象爬取某鱼颜值区主播图片
- 制作Java视频播放器
- 重启服务器命令有哪些,每一个重启命令区别又是什么?
- vue的组件和es6模板引擎 组件
- Microsoft Excel 2000/2003修复工具
- Visio Viewer 无法打开 VSD文件
- html加载特效大全,10种炫酷的CSS3 loading加载动画特效
- entware 安装 php7,[N1盒子]斐讯N1盒子entware环境安装amule下载ed2k出现KAD Firewall错误解决方法...
- Avaya Aura System Manager 8.1.3.x Hot Fix for Log4j vulnerabilities.
- Python学习网站(简明python教程,The Python Tutorial,Python学习笔记,啄木鸟社区)
热门文章
- 计算机里的文案怎么设置背景,win10系统设置浏览器背景的详细方案
- __builtin_expect用法
- 正确加载MySQL驱动的语句_使用数据库客户端工具Oracle SQL Developer加载第三方驱动连接mysql的方法...
- HDU-5455 Fang Fang (思维)
- SAS常用基础代码例子-聚类分析
- Centos7 虚拟机联网配置
- html中超链接使用_html中的a标签,超链接代码的详细介绍
- mysql sqlserver 性能优化_SQLServer性能优化之---数据库级日记监控
- lvcreate时报错
- R语言使用epiDisplay包的kap函数计算两个分类变量的相关性的强弱、计算一致性的比例以及Kappa统计量的值