您的位置:首页 > 运维架构

opencv入门 - 显示图像学习总结

2016-03-14 19:29 441 查看

OpenCV的第一个小程序-读取图像并显示

首先新建一个VC++控制台项目如下图所示。本文项目名称helloOpenCV。

在主文件中添加如下代码:

#include "stdafx.h"



#include <opencv2/opencv.hpp>



using namespace std;

using namespace cv;



int main(int argc, char* argv[])

{

const char* imagename = "emosue.jpg";



//从文件中读入图像

Mat img = imread(imagename);



//如果读入图像失败

if(img.empty())

{

fprintf(stderr, "Can not load image %s\n", imagename);

return -1;

}



//显示图像

imshow("image", img);



//此函数等待按键,按键盘任意键就返回

waitKey();



return 0;

}

添加需要打开的图片到对应目录本文添加emouse.jpg文件。

编译运行,结果如下图所示。

========

OpenCV读取图像_显示图像和保存图像

配置好 OpenCV 以后,包含以下两个头文件:

#include "cv.h"

#include "highgui.h"

IplImage* image=cvLoadImage("D:\\123.jpg",-1);

//函数cvLoadImage()的第1 个参数是图像文件的路径.

//第2 个参数是读取图像的方式:-1 表示按照图像本身的类型来读取,1 表示强制彩色化,0 表示

//强制灰值化.

if(image==NULL)

{

MessageBox("无法读取图像数据!", "提示",MB_OK);//在MFC 工程中这样用

//若在win32 控制台程序中,用printf("无法读取图像数据!\n");

return;//不作任何操作,就不会执行后面的程序了

}

cvNamedWindow("图像显示",CV_WINDOW_AUTOSIZE);

//该函数的功能是按照指定方式创建一个窗口,用于显示图像.

//第1 个参数是窗口的名称,自己可以任意设置

//第2 个参数表示窗口的大小会自动根据图像尺寸而变化

cvShowImage("图像显示",image);

//该函数的功能是在指定的窗口上显示图像.

//第1 个参数是显示图像窗口的名称

//第2 个参数是要显示的图像

cvSaveImage("D:\\saveImage.jpg",image);

//该函数的功能是将图像另存为

//第1 个参数是保存的路径,自己可以设置其它路径

//第2 个参数是要保存的图像

cvWaitKey(0);//一直等待按键没有这句的话图像不能正常显示

cvReleaseImage(&image);//释放图像内存

cvDestroyWindow("图像显示");//销毁窗口资源

//读取和显示完图像之后,要及时释放所占的内存资源.

运行示例:

========

初试牛刀-OpenCV显示图片

一、流程图

二、函数说明

1、cvLoadImage 打开图片函数

函数原型:

CVAPI(IplImage*) cvLoadImage( const char* filename, int iscolor CV_DEFAULT(CV_LOAD_IMAGE_COLOR));

返回值类型:Ip1Image*

参数说明:

1)const char* filename 图片路径

注意:文件路径用“\\”而不是“\”

2)int iscolor CV_DEFAULT(CV_LOAD_IMAGE_COLOR) 图片打开方式,默认是CV_LOAD_IMAGE_COLOR,也就是以彩色形式打开,在OpenCV定义了一些打开方式的

宏,分别为:

宏定义

数值

代表的意义

#define CV_LOAD_IMAGE_UNCHANGED

-1

与原图保持不变

#define CV_LOAD_IMAGE_GRAYSCALE

0

灰度图像(单通道)

#define CV_LOAD_IMAGE_COLOR

1

彩色图像(3通道)(默认值)

#define CV_LOAD_IMAGE_ANYDEPTH

2

任意颜色深度

#define CV_LOAD_IMAGE_ANYCOLOR

4

任意颜色

注意:a、如果想打开方式为原图形式,也就是默认的,可以不用配置这个参数

b、如果想配置多个值时,用“|”号隔开,例如:“2 |4”

c、如果想要载入最真实的图片参数设置为CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR

综合以上说明,函数cvLoadImage就很容易理解,比如

IplImage* img = cvLoadImage(“D:\\lena.jpg”,0);// 以灰度形式打开“D:\lena.jpg”文件

2、cvNamedWindow 创建窗口函数

函数原型:

CVAPI(int) cvNamedWindow( const char* name, int flags CV_DEFAULT(CV_WINDOW_AUTOSIZE) )

返回值类型:int

参数说明:

1)const char* name 窗口的名字,是显示图片(cvShowImage)函数中参数

2)int flags CV_DEFAULT(CV_WINDOW_AUTOSIZE) 窗口大小设置,有两种设置,默认是CV_WINDOW_AUTOSIZE

参数值

意义

CV_WINDOW_AUTOSIZE

窗口大小和图片大小一样(默认值)

0

窗口固定大小,可以用鼠标调整窗口大小

3、cvShowImage

函数原型:CVAPI(void) cvShowImage( const char* name, const CvArr* image

);

返回值类型:void(无值)

参数说明:

1)const char* name 窗口名,也就是cvNameWindow中创建的窗口

2)const CvArr* image 图片地址指针,也就是cvLoadImage的返回值

4、cvWaitKey

函数原型:CVAPI(int) cvWaitKey(int delay CV_DEFAULT(0));

返回值:int

参数说明:int delay CV_DEFAULT(0)等待时间,单位是毫秒(ms),特殊的,当这个值小于或等于0时,表示等待键盘任意键退出

5、cvReleaseImage

函数原型:CVAPI(void) cvReleaseImage( IplImage** image );

参数说明:IplImage** image 也就是cvLoadImage的返回值的指针

6、cvDestroyWindow

函数原型:CVAPI(void) cvDestroyWindow( const char* name );

参数说明:const char* name,也就是cvNamedWindow所创建窗口名

三、实现代码

#include "stdafx.h"

#include "highgui.h"

int main(int argc, char* argv[])

{

// 以灰度形式打开图片

IplImage* img = cvLoadImage("D:\\lena.jpg",0);

// 创建一个名为“ShowImage1”,大小根据图片大小

cvNamedWindow("ShowImage1",CV_WINDOW_AUTOSIZE);

// 显示图片

cvShowImage("ShowImage1",img);

// 图片显示等待3秒

cvWaitKey(3000);

// 释放图片内存

cvReleaseImage(&img);

// 销毁窗口

cvDestroyWindow("ShowImage1");

return 0;

}

========

OpenCV读取和显示图片

一、从文件读取图像并显示

1. 程序

#include <opencv2\highgui\highgui.hpp>

#include <iostream>

using namespace cv;

using namespace std;

int main(int argc, const char** argv)

{

Mat img = imread("earth.jpg", CV_LOAD_IMAGE_UNCHANGED);

if (img.empty())

{

cout << "图像加载失败!" << endl;

//system("pause");

return -1;

}

//创建一个名字为MyWindow的窗口

namedWindow("MyWindow", CV_WINDOW_AUTOSIZE);

//在MyWindow的窗中中显示存储在img中的图片

imshow("MyWindow", img);

//等待直到有键按下

waitKey(0);

//销毁MyWindow的窗口

destroyWindow("MyWindow");

return 0;

}

2. 解释

#include <opencv2\highgui\highgui.hpp>

imread(), namedWindow(), imshow() 和 waitKey() 函数都声明在这个头文件中。

Mat数据结构,它在”opencv2/core/core.hpp”中声明的,那为什么没有包含它呢?这是因为在”opencv2/highgui/highgui.hpp”头文件中已经包含了

core.hpp头文件,所以不用在我们的程序再次包含了。

using namespace cv;

“opencv2/core/core.hpp” 和 “opencv2/highgui/highgui.hpp中所有的数据结构和函数都声明在cv命名空间,所以,必须在我们程序的头部使用它,否则

就要在每个OpenCV的函数和数据结构前面都要加上”cv::”(例如:cv::Mat,cv::imread()等等)。

Mat img = imread("earth.jpg", CV_LOAD_IMAGE_UNCHANGED);

Mat是在矩阵中存储图片的数据结构,它声明在 “opencv2/core/core.hpp”头文件中。

imread()是声明在 “opencv2/highgui/highgui.hpp”的函数,它从文件加载一个图片并存储在Mat数据结构中。

imread()函数的声明如下:

CV_EXPORTS_W Mat imread( const string& filename, int flags=1 );

它的参数:

filename —— 文件的位置。如果只提供文件名,那么文件应该和C++文件在同一目录,否则必须提供图片的全路径。

flags —— 有5个可能的输入。

CV_LOAD_IMAGE_UNCHANGED – 在每个通道中,每个像素的位深为8 bit,通道数(颜色)保持不变。

CV_LOAD_IMAGE_GRAYSCALE – 位深=8 bit 通道数=1(颜色变灰)

CV_LOAD_IMAGE_COLOR -位深=?, 通道数=3

CV_LOAD_IMAGE_ANYDEPTH – 位深不变 ,通道数=?

CV_LOAD_IMAGE_ANYCOLOR – 位深=?, 通道数不变

上面的值还可以组合使用,比如:

CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR – 位深不变,通道数比便

CV_LOAD_IMAGE_COLOR | CV_LOAD_IMAGE_ANYDEPTH – 位深不变,通道数=3

如果你不确定使用哪个,就是用CV_LOAD_IMAGE_COLOR 。

要理解位深和通道的概念,应该熟悉图像处理的理论知识,所以下面讨论一点这方面的内容。

所有的数字图像都是由像素组成的,所有的像素都有值。一个像素的最小值为0,表示黑色。像素的值变大,它的亮度也会增强。每个像素分配的比特的固定

数值是255(十进制),也就是说每个像素分配8个bit。所以一个像素的最大值为255(二进制为11111111)。

那么什么是位深呢?位深就是为每个像素分配的比特。如果比特是8,每个像素的值可以是0-255。如果是4,每个像素的值可是0-15(二进制中为1111)。

下面是一个8 bit位深的图片的简单模型。每个小矩形表示一个像素。所以每个矩形包含一个0-255的值。

GrayscaleImage

这张图像的一些属性:

8 bit位深

一个通道(所以这是一个灰度图像)

高为4px

宽为5px

分辨率为4×5

这是一个灰度图像(黑白图像),因为该图像没有颜色内容。像素的值越高,图像就会越亮。像素值越低,图像就会越暗。

下面是一个彩色图像的简单模型。彩色图像至少包含3个平面:Red,Green和Blue。使用这3种颜色的特定组合可以创建任何颜色。所有的像素都是这3种颜色

值的组合。(255,0,0)表示pure red。(0,255,0)表示pure green。(255,0,255)表示pure violate。它的位深为24,因为每个像素为8×3 bit (每个通

道8 bit)。

ColorImage

这张图像的一些属性:

位深24 bit

3个通道(所以是彩色图像)

高4px

宽5px

分辨率为4×5

上面的模型,左上角的像素是(23,231,46)。它会显示为呈绿色的颜色,因为green值(231)比red(23)和blue(46)都大。

if (img.empty())

如果imread()函数加载图像失败,’img’不会加载任何数据,因此,img.empty()应该返回true。检查是否成功加载,如果没有则退出程序是一个好的做法,

否则当调用imshow()函数时,程序就会崩溃。

bool Mat::empty()

如果Mat::data==NULL或Mat::total()==0,这个函数返回true。

system("pause");

如果使用Visual Studio,这行注释的注释最好取消,因为它会暂停程序,知道用户按下任意键。如果不取消注释,程序会立即退出,用户也就不会看到错误

信息了。

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

这个函数创建一个窗口。它的参数如下:

winname——窗口的名字。这个名字会显示在窗口的标题栏上。

flags——决定窗口的尺寸。有如下选项:

WINDOW_AUTOSIZE – 用户不能改变图像的尺寸,图像显示为它的原有尺寸

CV_WINDOW_NORMAL – 调整窗口图像的尺寸可以改变

void imshow(const string& winname, InputArray mat);

这个函数在指定名字的窗口中显示存储在mat中的图像。如果窗口使用WINDOW_AUTOSIZE创建的,图像会显示为它的原始尺寸,否则图像会调整到窗口的尺寸大

小。

它的参数:

winname -窗口的名字。这个名字是namedWindow()函数创建窗口时使用的

mat – 存储图像数据的Mat对象

int waitKey(int delay = 0)

waitKey()函数通过指定delay(毫秒)等待按键的时间。如果delay是0或负数,它会永久等待。如果任意键被按下,这个函数就会返回按下键的ASCII值,程序

继续执行。如果指定的时间没有按下键,它返回-1,程序继续执行。

void destroyWindow(const string& winname)

这个函数关闭名字为winname的打开的窗口并释放关联的内存。这个函数对这个程序来说不是必须的,因为当程序退出,操作系统通常会关闭所有打开的窗口

并释放关联的内存。

二、创建一个空图像并显示

这个程序创建了一个空图像,而不是从文件中加载已存在的图像。

#include <opencv2\highgui\highgui.hpp>

#include <iostream>

using namespace cv;

using namespace std;

int main(int argc, const char** argv)

{

Mat img(500, 1000, CV_8UC3, Scalar(0, 0, 100)); //创建一个图像 ( 3个通道, 8 bit位深, 高500, 宽1000, (0, 0, 100) 分别分配给 Blue,

Green and Red. )

if (img.empty())

{

cout << "图像不能加载!" << endl;

//system("pause");

return -1;

}

namedWindow("MyWindow", CV_WINDOW_AUTOSIZE);

imshow("MyWindow", img);

waitKey(0);

destroyWindow("MyWindow");

return 0;

}

Mat::Mat(int rows, int cols, int type, const Scalar& s);

这是Mat的一个构造函数。它使用Scalar对象给定的值初始化Mat对象。

它的参数:

rows – 2维矩阵的行数 (图像的高度像素)

cols – 2维矩阵的列数 ( 图像的宽度像素)

type – 指定图像的位深,数据类型和通道数。我提供 CV_8UC3 ,指定3个通道的8 bit无符号整数,下面是这个参数一些可能的输入值:

CV_8UC1 – 单通道8 bit无符号整数

CV_8UC3 – 3通道8 bit为无符号整数

CV_64FC1 – 单通道64 bit 浮点数

s – 使用s给定的值初始化矩阵的每个元素。在上面的程序中,给定Scalar(0,0,100),因此,它使用0初始化第一个通道(Blue),0初始化第二个通道

(Green),100初始化第三个通道(Red)。所以,最终的图像是red。

在这个程序中,创建了一个高500,宽1000,有3个通道的图像。每个通道的每个像素分配8 bit的无符号整数(每个像素 8×3=24 bit),每个像素使用

(0,0,100)指定值。这意味着,第一个通道总是0,第二个通道也总是0,第三个通道总是100,因此,最终看到的是一个red的图像。

========

opencv 图像显示IplImage

图像显示的origin属性改变 (原点的改变)

#include <opencv\cv.h>

#include <opencv\highgui.h>

#include <opencv\cxcore.h>

#include <stdlib.h>

#include <stdio.h>



int main(int argc, char* argv[]){



IplImage* img;

img=cvLoadImage("d://1.jpg");

//原点显示 默认值 0:左上角是原点 1:左下角是原点

img->origin=1;

//输出图像通道数 3通道图像RGB模式

printf("nChannels is %d",img->nChannels);

cvNamedWindow("1");

cvShowImage("1",img);

cvWaitKey(0);

return 0;

}

三个颜色通道分割显示:

#include <opencv\cv.h>

#include <opencv\highgui.h>

#include <opencv\cxcore.h>

#include <stdlib.h>

#include <stdio.h>



int main(int argc, char* argv[])

{

IplImage* img , *sub_img;

int y,x;

//加载图像1.jpg

img = cvLoadImage("d:\\1.jpg");



/* 将3通道图像 分解成 3幅单通道的图像 */



//声明三个图像变量

IplImage* b_img ,*g_img,*r_img;



//给三个单通图像 分配内存空间

b_img = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U , 1 );

g_img = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U , 1 );

r_img = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U , 1 );



for(y=0;y<img->height;y++)

{

//将图像指针偏移到第y行

unsigned char* prow = (unsigned char*)( img->imageData + y* img->widthStep);

unsigned char* brow = (unsigned char*)(b_img->imageData + y*b_img->widthStep);

unsigned char* grow = (unsigned char*)(g_img->imageData + y*g_img->widthStep);

unsigned char* rrow = (unsigned char*)(r_img->imageData + y*r_img->widthStep);

for(x=0;x<img->width;x++)

{

//将B通道 G通道 R通道的值 分别拷贝到3个单通道的图像中去

brow[x] = prow[3*x + 0] ; //拷贝B通道的值prow[3*x + 0] 到 单通道图像b_img

grow[x] = prow[3*x + 1] ; //拷贝G通道的值prow[3*x + 0] 到 单通道图像b_img

rrow[x] = prow[3*x + 2] ; //拷贝R通道的值prow[3*x + 0] 到 单通道图像b_img

}

}

//创建3个窗口

cvNamedWindow("b");

cvNamedWindow("g");

cvNamedWindow("r");

//显示b g r三个通道的图像

cvShowImage("b" , b_img);

cvShowImage("g" , g_img);

cvShowImage("r" , r_img);



//显示大图像

cvNamedWindow("1");

cvShowImage("1",img);

//等待按键

cvWaitKey(0);



//释放内存空间

cvReleaseImage(&img);

return 0;



}

========

OpenCV2 图像的载入与显示

OpenCV的接口包括C++,C,Python的

我用MinGW编译OpenCV2.1 和 OpenCV2.2 从未成功过

前几日发现 OpenCV 2.3发布,下载了自解压程序,解压后又visual studio 2008,2010和MinGW版的

但其中的MinGW版的是官方 MinGW的,我使用的是在 http://nuwen.net/mingw.html 下载的

编译程序连接时总出错,于是下载了源码包,编译后能正常使用

先来看看最简单的图像的载入与显示,使用C++接口

#include <opencv2/core/core.hpp>

#include <opencv2/highgui/highgui.hpp>

using namespace cv;

int main(){

Mat image = imread("E:/Image/Lena.jpg");

namedWindow("MyPicture");

imshow("MyPicture",image);

waitKey(0);

return 0;

}

========

opencv显示图像

#include "highgui.h"

using namespace cv;

using namespace std;



int main()

{

IplImage *img = cvLoadImage("airplane.png");

cvNamedWindow("1");

cvShowImage("1",img);

cvWaitKey(0);

cvReleaseImage(&img);

cvDestroyWindow("1");



}

一些解释:

1.cvNamedWindow函数:

cvNameWindow(“Example”,CV_WINDOW_AUTOSIZE);

用于在屏幕上创建一个窗口,将被显示的图像包含于该窗口中

第一个参数:窗口标题

第二个参数:窗口的属性 默认为0(图像根据窗口的大小进行缩放)

2.cvLoadImage(const char * filename,int iscolor=1);

有两个输入参数:

第一个参数:图像路径

第二个参数:iscolor默认值为1,显示彩色图像,iscolor设置为0,表示显示黑白图像。

========

在vs2012中用opencv显示图像

如何用opencv2.44在VS2012中显示一幅彩色图像,并提取其灰度值,

VS2012+opencv2.44+win7.8

方法/步骤

1

第一步,这副图片是我们将要用来显示的图片

2

第二步,将相关库文件库加进去,包括利用opencv显示的库,

3

第三步,先要读入图片文件的地址,

然后将读入的地址给MAT类,读两次,一次给灰度图像用,另一次给彩色

图像用,下面用一个IF不判断出错的处理情况

4

第四步,创建显示窗口,前面参数是窗口名,后面的1表示图像不可缩放,创建一个灰度窗口和一个彩色窗口

5

第五步,将图像在创建的窗口中显示,第一参数是显示的窗口名,第二个参数是我们先读入的MAT图像,后面是按键返回

6

第六步,按上述代码完成后,成功显示图像

========
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: