OpenCV初步
注:原创不易,转载请务必注明原作者和出处,感谢支持!
一 写在开头
1.1 本文内容
本文的内容涉及了OpenCV 3.4.2在Ubuntu 16.04 LTS下的安装,OpenCV中图像的加载,显示,修改和保存等。
二 涉及的API
本文中涉及到的OpenCV API如下。这里只简要概括API的功能,API详细用法请参阅权威的官方文档。
- Mat cv::imread(const String &filename, int flags = IMREAD_COLOR);
imread()用于读取图片文件,读取到的图片以Mat对象返回。filename为图片路径名。flags用于控制图片的读取。如果读取失败,Mat.empty()会返回true,Mat.data会被设置为NULL。
- void cv::namedWindow(const String &winname, int flags = WINDOW_AUTOSIZE);
namedWindow()用于创建window,创建的window可以用作图像(Mat对象)的placeholder。可以理解为window是用于盛放并显示图像的容器。winname是window的名字,winname会被imshow()方法引用。flags决定了window的类型,常用的取值为WINDOW_AUTOSIZE。
- void cv::imshow(const String &winname, InputArray mat);
imshow()用于显示图像。winname是盛放图像的window的名字,mat为图像对象。
- void cv::cvtColor(InputArray src, OutputArray dst, int code, int dstCn = 0);
cvtColor()用于转换图片的颜色空间(color space),比如常用的RGB颜色空间等。src为原图像,dst为转换后的图像,code表示颜色空间转换代码,比如COLOR_BGR2GRAY表示将RGB的彩色图转换成灰度图。
- bool cv::imwrite(const String &filename, InputArray img, const std::vector ¶ms = std::vector());
imwrite()用于将图像写入文件中。filename是文件名,img表示要被写入文件的Mat对象,params表示参数向量。
- int cv::waitKey(int delay = 0);
waitKey()用于等待按键按下事件。delay表示延迟的时间。
三 OpenCV 3.4.2在Ubuntu 16.04 LTS下的编译安装
关于OpenCV的安装请参考官方提供的文档:Installation in Linux。我尝试过在Ubuntu 16.04 LTS中编译安装最新的OpenCV 4.0版本,但在安装过程中出现了严重的错误,没能成功安装。在我将版本降至3.4.2时才成功。
四 OpenCV安装测试与图像的加载和显示
4.1 安装测试
下面这个小实例用于测试OpenCV是否成功安装。之所以不同时使用using namespace std和using namespace cv是因为OpenCV库中有一些外部名和C++ STL中的名字冲突。
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main(int argc, char *argv[])
{
Mat src = imread("../images/lena.jpg", IMREAD_COLOR);
if (src.empty())
{
std::cout << "Could not load image..." << std::endl;
return -1;
}
namedWindow("Test OpenCV Install", WINDOW_AUTOSIZE);
imshow("Test OpenCV Install", src);
waitKey(0);
return 0;
}
使用下列命令来编译上面的cpp文件。
g++ -g -Wall -std=c++11 Test-OpenCV-Install.cpp -o Test-OpenCV-Install `pkg-config --cflags --libs opencv`
如果一切无误,使用命令./Test-OpenCV-Install运行可执行文件,可以看到如下图所示的结果。

4.2 图像的加载和显示
版本1
#include <cstdio>
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char *argv[])
{
if (argc != 2)
{
printf("usage : DisplayImage.out <image_path>\n");
return -1;
}
Mat img = imread(argv[1], IMREAD_COLOR);
if (!img.data)
{
printf("No image data...\n");
return -1;
}
namedWindow("Display Image", WINDOW_AUTOSIZE);
imshow("Display Image", img);
waitKey(0);
return 0;
}
编译并运行上述版本,结果如下。

版本2
#include <opencv2/opencv.hpp>
#include <iostream>
#include <string>
using namespace cv;
int main(int argc, char *argv[])
{
// default image name
std::string imgName("../images/lena.jpg");
if (argc > 1)
imgName = argv[1];
// load image file
Mat img = imread(imgName, IMREAD_COLOR);
if (img.empty())
{
std::cout << "Could not load image..." << std::endl;
return -1;
}
// create a image placeholder and show the image inside it
namedWindow("Display Image", WINDOW_AUTOSIZE);
imshow("Display Image", img);
// wait for a key press
waitKey(0);
return 0;
}
编译并运行上述版本,结果如下。

五 图像的修改和保存
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char *argv[])
{
if (argc != 3)
{
std::cout << "usage : convert.out <src_img_path> <des_img_path>" << std::endl;
return -1;
}
Mat src = imread(argv[1], IMREAD_COLOR);
if (src.empty())
{
std::cout << "could not load image..." << std::endl;
return -1;
}
Mat src_gray;
cvtColor(src, src_gray, COLOR_BGR2GRAY);
imwrite(argv[2], src_gray);
namedWindow(argv[1], WINDOW_AUTOSIZE);
namedWindow(argv[2], WINDOW_AUTOSIZE);
imshow(argv[1], src);
imshow(argv[2], src_gray);
waitKey(0);
return 0;
}
编译并运行上述版本,结果如下。

六 参考资料
- OpenCV文档
OpenCV初步的更多相关文章
- Android NDK开发及OpenCV初步学习笔记
https://www.jianshu.com/p/c29bb20908da Android NDK开发及OpenCV初步学习笔记 Super_圣代 关注 2017.08.19 00:55* 字数 6 ...
- 图像处理和OpenCV初步
图像从数学和计算机的角度理解就是一个矩阵,矩阵中的每一个元素叫做像素,又由于图像有灰度图像和彩色图像之分,所以图像在矩阵的基础上引入通道(channel),其中色彩用数字来表示的时候,规定数字0表示黑 ...
- Ubuntu中搭建强化学习平台(使用anaconda管理Python并安装tensorflow、opencv)
首先介绍一下anaconda,annoconda是一个开源的Python发行版本,里面集成了python.conda等多个科学包及其依赖项.安装完成之后,就可以使用conda版本管理器进行管理,可以让 ...
- OpenCV坐标体系的初步认识
实验基础 本次实验通过一个简短的例子,主要来说明下面4个问题: 1. 坐标体系中的零点坐标为图片的左上角,X轴为图像矩形的上面那条水平线:Y轴为图像矩形左边的那条垂直线.该坐标体系在诸如结构体Mat, ...
- 对OpenCV中seamlessClone的初步实验
seamlessClone是OpenCV中新出现的函数,应该说如果能够基于较为准确的图像分割,能够得到很好的结果. 原始的前景,背景 三种flag下的融合结果 //注意头文件中添加 #inclu ...
- opencv学习HighGUI图形用户界面初步【1】
HighGUI是图形用户界面模块.包括:1.输入与输出:2.视频捕捉:3.图形和视频的解码编码:4.图形交界面与接口. 由于opencv.hpp包含了core.objdetect.ingproc.ph ...
- opencv 1 HighGUI图形用户界面初步
1图像载入 显示和输出到文件 Opencv的命名空间 Mat类 图像的载入:imread()函数 图片的显示:imshow()函数 创建窗口:namedWindow()函数 输出图像到文件:imwri ...
- OpenCV学习(1)——初步接触
一.介绍OpenCV OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库.OpenCV是由英特尔公司发起并参与开 ...
- ubuntu下安装配置OpenCV
Cmake的安装 我用的是ubuntu-software自动下载安装的. Ubuntu 下安装 OpenCV 首先下载安装相关包,然后下载OpenCV 系统:ubuntu16.04 OpenCV:2. ...
随机推荐
- C# 霍尼韦尔扫码枪扫码打印
程序运行背景条件: 1.将扫码枪调制串口驱动模式 2.将扫码枪所在串口拆分成几个虚拟串口 3.扫码枪扫描条码就打印条码 4.WinForm程序 条码控件使用 DevExpress.XtraEditor ...
- PYTHON定义函数制作简单登录程序(详细)
环境:python3.* 结构: dict_name = {} #定义一个字典,后面用到 def newuser(): #定义注册函数 prompt1='login desired:' while ...
- 基于GDAL库,读取海洋风场数据(.nc格式)c++版
经过这一段时间的对海洋数据的处理,接触了大量的与海洋相关的数据,例如海洋地形.海洋表面温度.盐度.湿度.云场.风场等数据,除了地形数据是grd格式外,其他的都是nc格式的数据.本文将以海洋风场数据为例 ...
- 初窥css---盒子以及盒子扩展
盒子以及盒子扩展 盒子 盒子是用来实现将网页区域化的一个非常重要的工具,盒子使得网页各部分十分清晰的被分开,对于程序员十分友好(...),并且使得网页更加容易维护. 盒子的常用属性 宽和高这两个属性就 ...
- Android 获取验证码倒计时实现
Android 获取验证码倒计时实现 2017年10月24日 09:55:41 FBY展菲 阅读数:2002 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...
- Autoit 实现word拆分页解析 (python同理)
Autoit 实现word拆分页解析 (python同理) 背景 之前一直在做相关工作,由于没有找到解决最佳解决方案,老办法思路是 python先将word 转成pdf,按照页码 提取文字,从而实现w ...
- MySQL操作(备份很重要)
文档一: --修改用户密码的命令 mysqladmin -uroot -proot123 password mysql123 --登录mysql数据库的命令 mysql -uroot -proot12 ...
- 开发中,IDEA常用的快捷键
Settings文件: Ctrl+Alt+S 搜索文件:Ctrl+Shift+N 全文搜索: Ctrl+Shift+F 全文替换: Ctrl+Shift+R 搜索内容: Ctrl+F 内容替换: Ct ...
- linux 下ab压力测试
1.ab的简介 ab是apachebench命令的缩写. ab是apache自带的压力测试工具.ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试 ...
- 微信小程序-表单笔记
发布页——向云端数据库上传多行文字和4张图片 第6,8行注释掉和不注释掉都可以实现数据上传 var _this = this; wx.cloud.callFunction({ name: 'searc ...