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. ...
随机推荐
- SQL server 2017使用教程
1.安装: 从https://www.microsoft.com/en-us/sql-server/sql-server-downloads官网下载sql server2017试用版 180天 安装完 ...
- selenium之元素定位-css
CSS定位方式和XPATH定位方式基本相同,只是CSS定位表达式有其自己的格式.CSS定位方式拥有比XPATH定位速度快,且比XPATH稳定的特性.下面详细介绍CSS定位方式的使用方法 被测网页的HT ...
- 逆向-攻防世界-no-strings-attached
看题目就知道查找不到关键字符串,为防止踩坑,strings命令查看,没有找到有用的字符串.IDA载入程序查找入口函数, main函数中有4个函数,经过分析判断authenticate()为关键函数,跟 ...
- 浅谈 C# SQL防注入
1#region 防止sql注入式攻击(可用于UI层控制) 2 3/// 4/// 判断字符串中是否有SQL攻击代码 5/// 6/// 传入用户提交数据 7/// true-安全:f ...
- RMQ区间最大值与最小值查询
RMQ复杂度:建表$O\left ( nlgn \right ) $,查询$O\left ( 1 \right )$ ll F_Min[maxn][20],F_Max[maxn][20]; void ...
- SQL进阶随笔--case用法(一)
SQL进阶一整个是根据我看了pdf版本的整理以及自己的见解整理.后期也方便我自己查看和复习. CASE 表达式 CASE 表达式是从 SQL-92 标准开始被引入的.可能因为它是相对较新的技术,所以尽 ...
- 你不知道的CSS
white-space: pre-line;//P标签自动换行
- DAY30、网络编程
一.网络编程 软件开发 c/s架构 c:客户端 s:服务端 b/s架构 b:浏览器 s:服务端 本质:b/s其实也是c/s 服务端:24小时不间断提供服务,谁来救服务谁 客户端:想什么时候体验服务,就 ...
- docker 笔记
批量删除Docker中已经停止的容器[转] 方法一: #显示所有的容器,过滤出Exited状态的容器,取出这些容器的ID, sudo docker ps -a|grep Exited|awk '{p ...
- Helicute FPV App Privacy Policy
Personal Data collected for the following purposes and using the following services: Device permissi ...