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(&amp;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
第六步,按上述代码完成后,成功显示图像

========

opencv入门 - 显示图像学习总结相关推荐

  1. Opencv 入门篇学习记录(图片)

    title: Opencv 入门篇学习记录(图片) Opencv 入门篇学习记录(图片) 前言 很早以前就接触Python了,大学的时候还自学了一段时间去做了课设,写了一些最速梯度下降法.黄金分割法. ...

  2. OpenCV入门基础学习

    目录 一:OpenCV简介 二:OpenCV图像处理   图像 三:OpenCV图像处理   图像模式 四:OpenCV图像识别  图片操作 五:OpenCV图像处理   Mat类 六:OpenCV图 ...

  3. opencv入门使用

    Opencv入门使用 学习国外视频之后手打的教程,若有不对的地方请留言== 1.显示图片 import cv2img = cv2.imread("./resources/KS.jpg&quo ...

  4. 【计算机视觉】opencv入门学习笔记Part.1

    [计算机视觉]opencv入门学习笔记Part.1 1 前言 1.1 opencv概述(摘取自百度百科) 1.2 图像概念引入 1.3 安装opencv库 2 图像基本操作 2.1 图像的读取 2.2 ...

  5. 如何从入门开始学习OpenCV?

    下面先给大家介绍下OpenCV的简介.安装及基本操作,更多详情可以看这个视频,学完之后可完成opencv人脸识别案例. 黑马程序员人工智能教程_10小时学会图像处理OpenCV入门教程_哔哩哔哩_bi ...

  6. agx 安装ros opencv_史上最全的OpenCV入门教程!这篇够你学习半个月了!万字长文入门...

    一.Python OpenCV 入门 欢迎阅读系列教程,内容涵盖 OpenCV,它是一个图像和视频处理库,包含 C ++,C,Python 和 Java 的绑定. OpenCV 用于各种图像和视频分析 ...

  7. 史上最全的OpenCV入门教程!这篇够你学习半个月了!万字长文入门

    推荐下我自己建的人工智能Python学习群:[809160367],群里有我整理的一份关于pytorch.python基础,图像处理opencv\自然语言处理.机器学习.数学基础等资源库,想学习人工智 ...

  8. 【学习OpenCV4】OpenCV入门精讲(C++/Python双语教学)

    大家好,我在CSDN开的OpenCV课程已经开课了,入口如下: OpenCV入门精讲(C++/Python双语教学) 课程开始快一周了,收到了广大同学们的欢迎. (1)评分很高: (2)已经有50+同 ...

  9. 【AI白身境】搞计算机视觉必备的OpenCV入门基础

    文章首发于微信公众号<有三AI> [AI白身境]搞计算机视觉必备的OpenCV入门基础 今天是新专栏<AI白身境>的第五篇. 曾经看过一个视频,树莓派自平衡机器人自动追着小球跑 ...

最新文章

  1. 安装mysql时报错:mysql file /usr/share/mysql/czech/errmsg.sys from install of MySQL-serve的问题...
  2. 关于python提交spark以及在spark环境中使用本地包的方法--针对于集群无法在线下包以及python版本和spark绑定的问题解决
  3. tornado autoreload 模式
  4. Unreal Engine 4:虚幻4 文档
  5. Ubuntu | 安装Pcan驱动和pcanview
  6. win7怎样修改文件后缀名
  7. python 对 PDF 的拆分 和合并
  8. 搭建以图搜图检索系统
  9. 云南大学计算机在职硕士,在职硕士
  10. 矩形碰撞公式,以前还做j2me时就用到的公式,为了方便查找,这里记一下
  11. UML简单介绍(五)——用例图的使用案例与分析
  12. PHP 开发新版个人博客
  13. [从头读历史] 第249节 易经
  14. Android Studio官方文档之添加URL和App索引支持
  15. 流量分类方法设计(一)——参考论文整理
  16. Python编程:re中findall()用法
  17. Arduino开发教程汇总
  18. Suggestions of 周爱民
  19. NVIDIA AGX xavier 系列一 刷机步骤经验总结
  20. URP——着色器和材质——简单光照 Simple Lit

热门文章

  1. C语言实现割线法求零点以及详解割线法
  2. C# 学习笔记(11)蓝屏小工具
  3. CodeBlacks程序调试的那些事
  4. CTFshow 命令执行 web46
  5. 工作计划2017-01-03
  6. zeros--创建零矩阵
  7. opencv Remap 图像的映射
  8. php 判断来源 微信客户端_PHP判断手机端、PC端 、微信代码实例
  9. 证明连通简单图是哈密顿图
  10. 雅克比迭代法求方程组的解(Python实现)