注:原创不易,转载请务必注明原作者和出处,感谢支持!

一 写在开头

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 &params = 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 stdusing 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;
}

编译并运行上述版本,结果如下。

六 参考资料

  1. OpenCV文档

OpenCV初步的更多相关文章

  1. Android NDK开发及OpenCV初步学习笔记

    https://www.jianshu.com/p/c29bb20908da Android NDK开发及OpenCV初步学习笔记 Super_圣代 关注 2017.08.19 00:55* 字数 6 ...

  2. 图像处理和OpenCV初步

    图像从数学和计算机的角度理解就是一个矩阵,矩阵中的每一个元素叫做像素,又由于图像有灰度图像和彩色图像之分,所以图像在矩阵的基础上引入通道(channel),其中色彩用数字来表示的时候,规定数字0表示黑 ...

  3. Ubuntu中搭建强化学习平台(使用anaconda管理Python并安装tensorflow、opencv)

    首先介绍一下anaconda,annoconda是一个开源的Python发行版本,里面集成了python.conda等多个科学包及其依赖项.安装完成之后,就可以使用conda版本管理器进行管理,可以让 ...

  4. OpenCV坐标体系的初步认识

    实验基础 本次实验通过一个简短的例子,主要来说明下面4个问题: 1. 坐标体系中的零点坐标为图片的左上角,X轴为图像矩形的上面那条水平线:Y轴为图像矩形左边的那条垂直线.该坐标体系在诸如结构体Mat, ...

  5. 对OpenCV中seamlessClone的初步实验

    seamlessClone是OpenCV中新出现的函数,应该说如果能够基于较为准确的图像分割,能够得到很好的结果. 原始的前景,背景 三种flag下的融合结果   //注意头文件中添加  #inclu ...

  6. opencv学习HighGUI图形用户界面初步【1】

    HighGUI是图形用户界面模块.包括:1.输入与输出:2.视频捕捉:3.图形和视频的解码编码:4.图形交界面与接口. 由于opencv.hpp包含了core.objdetect.ingproc.ph ...

  7. opencv 1 HighGUI图形用户界面初步

    1图像载入 显示和输出到文件 Opencv的命名空间 Mat类 图像的载入:imread()函数 图片的显示:imshow()函数 创建窗口:namedWindow()函数 输出图像到文件:imwri ...

  8. OpenCV学习(1)——初步接触

    一.介绍OpenCV           OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库.OpenCV是由英特尔公司发起并参与开 ...

  9. ubuntu下安装配置OpenCV

    Cmake的安装 我用的是ubuntu-software自动下载安装的. Ubuntu 下安装 OpenCV 首先下载安装相关包,然后下载OpenCV 系统:ubuntu16.04 OpenCV:2. ...

随机推荐

  1. rabbitmq之基本原理及搭建单机环境

    1.RabbitMQ基本原理 1.MQ全称Message Queue,是一种分布式应用程序的通信方法,是消费-生产者模型的典型代表,producer向消息队列中不断写入消息,而另一端consumer则 ...

  2. selenium-日志文件的使用(十二)

    概述 在自动化测试中,如果测试失败需要对错误的错误的代码或者测试case进行分析,进行分析时最好的方法是在项目中添加日志文件,通过日志文件的分析定位出现错误的原因. 这样可以保持自动化测试用例的健壮性 ...

  3. CynosDB技术详解——架构设计

    本文由腾讯云数据库发表 前言 CynosDB是新一代分布式数据库,100%兼容MySQL和PostgreSQL,支持存储弹性扩展,一主多从共享数据,性能更是超越社区原生MySQL和PostgreSQL ...

  4. jquery字符串操作

    目的:把自己常用到的jquery操作字符串总结一下 w3cSchool关于js字符串的整理:有需要的时候可以查 http://www.w3school.com.cn/js/jsref_obj_stri ...

  5. torm入门(三)HelloWorld示例

    一.配置开发环境 storm有两种操作模式: 本地模式和远程模式.使用本地模式的时候,你可以在你的本地机器上开发测试你的topology, 一切都在你的本地机器上模拟出来; 用远程模式的时候你提交的t ...

  6. Spring boot读取application.properties中文乱码

    解决方案 在IDEA环境下: File -> Settings -> Editor -> File Encodings 将Properties Files (*.properties ...

  7. 10 Django RESTful api 实现匿名访问

    # views_send_code.py from rest_framework.permissions import AllowAny class MsgCodeViewSet(CreateMode ...

  8. JS 设计模式七 -- 外观模式

    概念 为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使子系统更加容易使用. 外观模式在JS中,可以认为是一组函数的集合. 实现 // 三个处理函数 function start() ...

  9. 小小知识点(十三)——MATLAB中怎么保存和读取.mat文件

    1.存储 利用save函数 save(filename)  %将当前工作区中的所有变量保存在 MATLAB® 格式的二进制文件(MAT 文件)filename 中. save(filename,var ...

  10. Linux系统安装jdk教程

    本文仅仅适用于刚刚接触Linux系统的童鞋,毕竟本人也才刚刚玩这个东西,在此记录下以便于以后能查阅及其他童鞋能进行参考,本文为原创随笔,如需转发,请标明出处,谢谢: 此处我采用的是用VMware搭建的 ...