opencv学习记录1

OPENCV学习手册

欢迎使用Markdown编辑器

opencv是学习计算机视觉不可缺少的一个工具,其中包含了很多计算机视觉处理的函数,并且与C++,Python等常用语言适配,使用方便。
关于opencv 的安装可以参考该片博客,叙述较为详细,opencv 的安装

OpenCV读取和写入图像文件

所有的 OpenCV 类和函数都在 cv 命名空间(namespace)中,因此,在源代码中还有如下两个选项:
1.在包含头文件后还应添加使用命名空间 cv 的声明(using namespace cv)。
2.对用到的所有 OpenCV 类、函数和数据结构上附加 cv:: 前缀。如果由 OpenCV 提供的外部名字与常用的标准模块库(standard template library,STL)或其他库冲突,那么就推荐使用这个选项。
OpenCV支持图像文件的格式
OpenCV 支持最常见的图像格式。但是,某些图像格式需要(免费提供的)第三方类库。由 OpenCV 支持的主要格式有:
Windows bitmaps(.bmp、dib);
Portable image formats(
.pbm、
.pgm、.ppm);
Sun rasters(
.sr、*.ras);

需要辅助库的格式有:
JPEG(.jpeg、.jpg、.jpe);
JPEG 2000(
.jp2);
Portable Network Graphics(.png);
TIFF(
.tiff、.tif);
WebP(
.webp);
对于 OpenCV 3.0 版本,除了上面列出的格式外,它还包含一个由地理数据抽象库(Geographic Data Abstraction Library,GDAL)所支持格式(NITF、DTED、SRTM等)的驱动器,通过 CMake 的选项 WITH_GDAL 来设置。注意,在 Windows OS 上,对 GDAL 的支持还没有经过广泛测试。
在 Windows 和 OS X 中,默认对这些格式(libjpeg、libjasper、libpng和libtiff)使用 OpenCV 附带的编解码器。之后,在这些操作系统中,可以读取 JPEG、PNG 和 TIFF 格式。Linux(和其他类 UNIX 开源操作系统)会寻找安装在系统中的编解码器。在 OpenCV 之前,可以安装编解码器或从 OpenCV 包中通过在 CMake 中设置正确的选项(例如,BUILD_JASPER、BUILD_JPEG、BUILD_PNG 和 BUILD_TIFF)来构建其他库。
OpenCV示例代码
为了说明如何使用 OpenCV 读、写图像文件,现在,我们将描述 showImage 示例,如图1所示
在这里插入图片描述

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;
int main(int, char *argv[])
{
    Mat in_image, out_image;
    // Usage: <cmd> <file_in> <file_out>
    //读取原始图像
    in_image = imread(argv[1], IMREAD_UNCHANGED);
    if (in_image.empty()) {
        //检查是否读取图像
        cout << "Error! Input image cannot be read...\n";
        return -1;
    }
    //创建两个具有图像名称的窗口
    namedWindow(argv[1], WINDOW_AUTOSIZE);
    namedWindow(argv[2], WINDOW_AUTOSIZE>;
    //在之前创建的窗口中显示图片
    imshow(argv[1], in_image);
    cvtColor(in_image, out_image, COLOR BGR2GRAY);
    imshow(argv[2], in_image);
    cout << "Press any key to exit...\n";
    waitKey(); // Wait for key press
    //写入图像
    imwrite(argv[2], in_image);
    return 0;
}

在本示例中,两个文件名称作为参数给出。第一个是读取的输入图像文件。第二个是使用输入图像的一个灰度副本写入的图像文件。
此处,使用 #include 指令包含 opencv.hpp 头文件,实际上,它包含所有的 OpenCV 头文件。通过包含该单个文件,不再需要包含其他文件。
声明所使用的 cv 命名空间之后,在这个命名空间内的所有变量和函数都不再需要 cv:: 前缀。在主函数中要做的第一件事情就是检查命令行中传递的参数个数。之后,如果出现错误,则显示一个帮助消息。
OpenCV读取图像文件
函数 imread 的原型如下:

Mat imread(const String& filename,int flags = IMREAD_COLOR)

flag 指定读取图像的颜色,并在 imgcodecs.hpp 头文件中由如下枚举类型定义和解释:

enum { IMREAD_UNCHANGED = -1, // 8 位,彩色或非彩色
    IMREAD_GRAYSCALE = 0, // 8 位,灰度
    IMREAD_COLOR = 1, //未改变深度、颜色
    IMREAD_ANYDEPTH = 2, //任意深度,未改变颜色
    IMREAD_ANYCOLOR = 4, //未改变深度,任意颜色
    IMREAD_LOAD_GDAL = 8 // 使用 gdaL 驱动程序
};

读取输入的图像文件之后,应检查操作是否成功。可使用成员函数 in_image.empty() 来实现这个检查。如果读取图像文件时没有发生错误,会创建两个窗口分别显示输入图像和输出图像。使用如下函数进行窗口的创建:

void namedWindow(const String& winname,int flags = WINDOW_AUTOSIZE)

OpenCV 窗口
OpenCV 窗口是通过程序中一个意义明确的名字来识别的。通过下面 highgui.hpp 头文件中的枚举给出该标志的定义及其说明:

enum { WINDOW_NORMAL = 0x00000000,
    //用户可以调整窗口的大小(无约束)
    //还可以将一个全屏窗口切换为常规窗口
    WINDOW_AUTOSIZE = 0x00000001,
    //用户不能调整窗口的大小,
    //窗口的大小由显示的图像所限制
    WINDOW_OPENGL = 0x00001000, // OpenGL 支持的窗口
    WINDOW_FULLSCREEN = 1,
    WINDOW_FREERATIO=0x00000100,
    //图像可任意使用(调整图像时可没有比例限制)
    WINDOW_KEE PRATIO = 0x00000000
    //调整图像时保持图像的缩放比例
};

OpenCV 显示图片
一个窗口的创建不会在屏幕上显示任何内容。在一个窗口中显示一幅图像的函数(属于 highgui 模块)是:

void imshow(const String& winname,InputArray mat)

如果使用 WINDOW_AUTOSIZE 标志创建该窗口(winname),那么所显示的是原始大小的图像(mat)。
在 showImage 示例中,第二个窗口显示输入图像的一个灰度副本。为了将一幅彩色图像转换为灰度图像,使用 imgproc 模块的函数 cvtColor。实际上使用这个函数来改变图像的颜色空间。

在一个程序中创建的任何窗口都可以从默认设置下调整大小和进行移动。当不再需要任何窗口时,应该销毁窗口,以便释放其资源。像示例中那样,在一个程序结束时,会隐式地完成资源的释放。

在内部循环中处理事件
如果在一个窗口上显示一幅图像之后不再做任何事情,出乎意料地,将不再显示图像。在一个窗口显示一幅图像之后,我们应该开始一个循环,以获取和处理与用户和窗口交互有关的事件。通过如下函数可执行这样一个任务(从 highgui 模块中):

int waitKey(int delay=0)

这个函数在数毫秒(delay>0)内等待一个按键操作,并返回键的编码,如果延迟结束时没有按键则返回 -1。如果 delay 是 0 或负数,那么函数一直等待直到一个键被按下,只有至少创建和激活一个窗口时,函数 waitKey 才会工作。
OpenCV写入图像文件
imgcodecs 模块中的另一个重要函数是:

bool imwrite(const String& filename,InputArray img,const vector<int>& params=vector<int>())

这个函数将一幅图像(img)保存到一个文件(filename),作为第三个可选参数,一个“属性-值”对的向量指定编解码器的参数(为使用默认值将其设置为空)。编解码器由文件的扩展名决定。
参考:
[1]: http://c.biancheng.net/view/1790.html
[2]: opencv中文学习手册
[3]: https://mermaidjs.github.io/
[4]: http://adrai.github.io/flowchart.js/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值