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. ...
随机推荐
- vtop工具使用分析
vtop工具可以为esxtop提供图形界面,并且可以显示实时统计数据,对于我们监控esxi主机的需求匹配度很高,同时,相对于vcenter中的数据统计选项实时性更高,操作简便,可作为工作使用 为便于我 ...
- nginx配置文件详细解读
https://m.w3cschool.cn/nginx/nginx-d1aw28wa.html ######Nginx配置文件nginx.conf中文详解##### #定义Nginx运行的用户和用户 ...
- 【数据库】+ powerdesigner
使用powerdesigner工具对现有数据库表 生成关系图:https://www.cnblogs.com/lusunqing/p/4128025.html 通过Excel生成PowerDesign ...
- 华为笔记HOSTS,便于访问云端存储
# Copyright (c) - Microsoft Corp. # # This is a sample HOSTS file used by Microsoft TCP/IP for Windo ...
- 使用RAP2和Mock.JS实现Web API接口的数据模拟和测试
最近一直在思考如何对Web API的其接口数据进行独立开发的问题,随着Web API的越来越广泛应用,很多开发也要求前端后端分离,例如统一的Web API接口后,Winform团队.Web前端团队.微 ...
- flask轻量级框架入门
# -*- encoding: utf-8 -*- #导入Flask类, 导入重定向,url_for是简易寻址跳转, from flask import Flask,redirect,url_for, ...
- day11(函数参数,函数对象,打散机制,函数嵌套调用)
一,复习 # 什么是函数:具体特定功能的代码块 - 特定功能代码块作为一个整体,并给该整体命名,就是函数 # 函数的优点: # 1.减少代码的冗余 # 2.结构清晰,可读性强 # 3.具有复用性,开发 ...
- python使用装饰器对文件进行读写操作'及遍历文件目录
'''使用装饰器对文件进行读写操作''' # def check_permission(func): # '''演示嵌套函数定义及使用''' # def wrapper(*args,**kwargs) ...
- iframe 高度自适应
<iframe id="InputDetail" src style="width:100%"></iframe> <script ...
- win 解压安装mysql步骤
5 安装成功之后,启动mysql时报错: 系统错误2,找不到指定的文件.原因:有的系统安装过MySQL没有卸载干净,或者系统自带精简版的MySQL导致注册表关于MySQL的配置与实际安装路径不一致. ...