博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenCV(1)读写图像
阅读量:6154 次
发布时间:2019-06-21

本文共 1739 字,大约阅读时间需要 5 分钟。

图像:OpenCV中,图像是存储在矩阵格式中的数字序列。图像中的每个点称为像素。每个像素可以存储一个或多个值。

如果图像是二进制图像(只有黑白灰三色),那么只有一个值(0或1)。彩色图像可以存储三个值,这些值可以是介于0到255之间的整数,不过在另一种彩色图像中是0到1的浮点数。

Mat:OpenCV中矩阵用Mat类来实现。而Mat类不仅用来存储图像,还可以存储任意大小的不同类型的矩阵。还可以存储代数矩阵并进行操作。

在内存中,矩阵被保存为数组或值按行和列有序排列的序列。按照下面公式可以访问BGR图像格式中的任意一个像素:

Value=所在行*总列数*颜色通道数+所在列+所在颜色通道

 

现在学习如何读取和写入图像:#include "stdafx.h"#include"opencv2/core.hpp"#include"opencv2/highgui.hpp"

#include
using namespace std;using namespace cv;int main(){  //读取图像  Mat color = imread("JOJO.jpg");  Mat gray = imread("JOJO.jpg", 0);   //写图像  imwrite("JOJOGray.jpg", gray);   //通过OpenCV函数获取一个像素  int myRow = color.rows - 1;  int myCol = color.cols - 1;  Vec3b pixel = color.at
(myRow, myCol);  cout << "Pixel value (B,G,R):(" << (int)pixel[0] << "," <<  (int)pixel[1] << "," << (int)pixel[2] << ")" << endl;   //显示图像  imshow("JOJO BGR", color);  imshow("JOJO Gray", gray);  //等待按键  waitKey(0); return 0;}

 

首先是头文件。core中包括了例如矩阵等基本类,highhui中包括读取、写入和使用图形界面显示图像的函数。可以注释掉他们试一试。

imread是用于读取图像的主要函数。这个函数打开图像,并以矩阵格式存储图像。imread函数有两个,第一个是包含这个图像路径的字符串,第二个参数默认情况下是可选的。第二个参数允许下列选项:

CV_LOAD_IMAGE_COLOR(或省略这个参数和逗号):将图像转换为彩色的。

CV_LOAD_IMAGE_GRAYSCALE(或写逗号和0):将图像转换为灰度。

 

计算机中可以用imwrite函数存储矩阵图像。第一个参数是图像保存路径,第二个参数是想要保存的矩阵图像。在上面的代码中第一个参数只是我设定的文件名。

以上两个函数,如果不写路径的话,会默认读取/保存在和cpp文件相同的文件夹中。

 

利用矩阵的.cols和.rows属性,就可以访问图像的列(column)和行(row)数。也就是宽度和高度。

若要访问图像的一个像素,可以使用OpenCV的Mat类中的cv::Mat::at<typename t>(row,col)函数模板。模板参数是有返回类型的不同的。8位彩色图像中的typename是一个Vec3b类,它存储三个无符号字符数据(Vec=向量,3=组件数,b=1字节)。灰度图像中,可以直接使用图像中的无符号的字符或任何其他数字格式。例如:

uchar pixel = color.at<uchar>(myRow,myCol);

 

最后,若要显示图像,可以使用imshow函数创建一个窗口。第一个参数是标题,第二个参数是图像矩阵。

 

如果想允许等待用户按任意键停止应用程序,可以使用OpenCV中的waitKey函数,参数为要等待的毫秒数。如果将这一参数设置为0,将永远等待。

转载于:https://www.cnblogs.com/Shymuel/p/8495112.html

你可能感兴趣的文章
实战2——Hadoop的日志分析
查看>>
利用FIFO进行文件拷贝一例
查看>>
Ecshop安装过程中的的问题:cls_image::gd_version()和不支持JPEG
查看>>
resmgr:cpu quantum等待事件
查看>>
一个屌丝程序猿的人生(六十六)
查看>>
Java 编码 UTF-8
查看>>
SpringMVC实战(注解)
查看>>
关于静态属性和静态函数
查看>>
进程的基本属性:进程ID、父进程ID、进程组ID、会话和控制终端
查看>>
spring+jotm+ibatis+mysql实现JTA分布式事务
查看>>
MyBatis启动:MapperStatement创建
查看>>
调查问卷相关
查看>>
eclipse启动无响应,老是加载不了revert resources,或停留在Loading workbench状态
查看>>
1. Git-2.12.0-64-bit .exe下载
查看>>
怎样关闭“粘滞键”?
查看>>
[转]React 教程
查看>>
拓扑排序介绍
查看>>
eclipse打开工作空间(workspace)没有任务反应
查看>>
使用Sybmol模块来构建神经网络
查看>>
字符串去分割符号
查看>>