OpenCV(1)读写图像

图像: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<iostream>
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<Vec3b>(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