利用OpenCV实现C++语言中二维数组的图像显示
在利用C++语言处理数组时,我们经常需要将图片的二维数组进行可视化;所以本文分享了一种利用OpenCV读取和生成图片的方法。
1. 利用OpenCV读取图片
前提条件:
- 本文的程序是在visual Studio2012中执行的;
- vs已经配置好调用OpenCV需要的设置,如包含库目录,库文件等;
- 在当前文件夹下有一幅名为“1”的.jpg格式的图片;
在满足上述条件的情况下,执行如下程序,可读取1.jpg这幅图片。
如何读取不同的图片,如何变通?
关键的命令是:
“imread(filename,option)”
变通只要将filename变换为对应的“文件名”或者“路径+文件名”即可,注意程序里的双引号要用英文格式的。通过选择option可用不同的方式读取图片,本文是灰度读取“IMREAD_GRAYSCALE”。
程序:
#include "opencv.hpp"
#include "highgui.hpp"
using namespace cv;
int main()
{
Mat image=imread("1.jpg",IMREAD_GRAYSCALE);
cvNamedWindow("source image");
imshow("source image",image);
waitKey();
}
运行结果如下:
完整的结果:
2. 利用OpenCV实现C++语言中二维数组的可视化
仔细理解第一部分的程序,你就可以知道OpenCV显示图像是通过这一命令实现的:
“imshow("source image",image)”
其中"source image"是打开图片窗口的名称,image就是你的Mat类型的变量。
对于C++语言的二维数组,它一般为数值类型(整形、浮点型、字符串等等),所以无法直接进行可视化,需要将二维数组的类型赋值给Mat类型的变量。
给Mat类型的变量(假设为B)进行赋值需要执行命令:
“B.data[i] = 255;”
这里涉及到对象(结构体)的知识,你不理解也没关系,只要认为B.data就是Mat类型变量的数组就可以,如B.data[0],就是访问数组的第一个元素;B.data是一个一维数组,所以二维数组进行赋值时需要将元素对应到一维数组上。
实现程序如下:
#include "opencv.hpp"
#include "highgui.hpp"
#include "math.h"
using namespace cv;
int main()
{
const int M = 300,N = 400; //图片的行、列像素
int data[M][N] = {0}; //创建一个200×200的数组
//下面循环产生一个沿对角线变大的数组
for(int i=0;i<M;i++)
for(int j=0;j<N;j++)
data[i][j] = (int)(255*sqrt(i*i+j*j)/500);
Mat B = Mat(M,N,CV_8UC1); //创建一个M×N大小的变量
for(int i=0;i<M;i++)
{
for(int j=0;j<N;j++)
{
B.data[i*N+j]=data[i][j];
}
}
cvNamedWindow("source image1");
imshow("source image1",B);
waitKey();
return 0;
}
执行结果如下:
完整的结果:
3. 结论
利用Mat类型的.data性质进行变量访问,就可以实现二维数组赋值给Mat类型变量了,进而利用OpenCV的imshow命令将结果可视化。