将图片在指定窗口中显示-OpenCV应用学习笔记一

                                       萌虎嗅蔷薇logo

一、OpenCV模块划分

OpenCV其实就是一堆用C和C++语言来实现计算机视觉算法的源代码文件;例如C接口函数cvCany()实现了Canny边缘提取算法,咱们能够直接将这些源代码添加到本身的软件项目中,而不须要本身去写代码实现Canny算法。同时因为源文件居多,因此根据算法的功能将源文件分到多个模块中(以下),将每一个模块中的源文件编译成一个库文件(如opencv_core.lib、opencv_highgui.lib),用户调用时仅将所需的库文件添加到本身的项目中,与本身的源文件一块儿链接成可执行程序便可。c++

OpenCV2.0主体分为五个模块

一、CV图像处理和视觉算法算法

  二、MLL统计分类器数组

  三、HighGUI图像和视频输入/输出数据结构

  四、CXCORE(基本结构和算法,XML支持,绘图函数)函数

  五、CvAux(存放即将被淘汰的算法和函数,新出现的实验性算法和函数)ui

CVCAM摄像机接口属于OpenCV1.0版内容,在之后的版本中被弃用)spa

二、命令行参数 argc/argv

c/c++语言中的main函数,常常带有参数argc,argv,以下:操作系统

int main(int argc,char** argv)或者int main(int argc,char* argv[])命令行

*一、argc:命令行输入参数个数,以空白符分隔3d

*二、argv:中存储了命令行参数

*三、以下图在dos命令下进入到openpictures.exe文件所在目录下运行命令:openpictures.exe lena.jpg  lena2.jpg

那么有:argc=3,argv[0] = openpictures.exe,argv[1] = lena.jpg,argv[2] = lena2.jpg。

S7[S{Y_7O70Y1X{~[MJSQAC_thumb[4]

三、麻雀虽小五脏俱全之典例精析

实现功能:

    输入openpictures.exe lena.jpg命令符后,执行:显示lena.jpg图片的功能

    输入openpictures.exe lena.jpg lena2.jpg命令符后,执行:显示lena.jpg图像、并将其写入lena2.jpg文件           

  (你会发如今lena.jpg所在文件目录下多出来一个lena2.jpg文件而且跟lena.jpg图片信息同样)

函数精析:

  1. cvLoadImage(fileName,flag)

    • 将图像文件fileName以flag表明的格式加载至内存
    • fileName包含文件的扩展名,肯定被加载文件的格式;例如lena.jpg
    • flag<0:默认读取图像的原通道数;flag=0:强制以单通道灰度形式读取;flag>0:强制以三通道形式读取
    • 高层调用接口,经过fileName肯定被加载文件的格式,而且该函数将自动分配图像数据结构所需的内存。函数执行完后将返回一个指针,此指针指向一块为描述该图像文件的数据结构而分配的内存块。
  2. cvNamedWindow(“win1”,CV_WINDOW_AUTOSIZE)

    • 用于在屏幕上建立一个窗口,将被显示的图片包含于该窗口中
    • win1:指定了窗口的标题,其余函数与该窗口进行交互使用时,经过该参数值引用这个窗口
    • 第二个参数定义了窗口的属性,一般设为CV_WINDOW_AUTOSIZE/1,二者等价:表示窗口大小会自动调整以适应被显示的图像,而且不可以手动调节大小。设为>=0的其余数值时:图像只能在窗口中根据窗口大小进行拉伸或缩放。
  3. cvShowImage(“win1”,img)

    • 将在制定的窗口win1中显示图像img
    • 参数1:显示图像的窗口标识符;参数2:要被显示的图像
    • 该函数调用时窗口将被从新绘制,同时图像也会显示在窗口中
    • 只要有一个与某个图像文件相对应的IplImage*类型指针,咱们就能够在一个已建立好的窗口中使用该函数显示该图像
  4. cvWaitKey(int delay)

    • delay<=0时:永久等待;delay>0时:等待至少delay毫秒时间,由于考虑到操做系统切换时间
    • 在没有按键按下时,函数等待delay 毫秒时间长后返回-1;若是按键按下则返回按键的ASCII码,而后继续执行程序
    • fileName包含文件的扩展名,肯定被加载文件的格式;例如lena.jpg
    • flag<0:默认读取图像的原通道数;flag=0:强制以单通道灰度形式读取;flag>0:强制以三通道形式读取
  5. cvReleaseImage(&img)

    • 一旦用完加载到内存的图像文件,咱们就能够释放该图像文件所分配的内存。调用完毕后img指针将被设置为NULL。
  6. cvDestoryWindow(“win1”)

    • 销毁显示图像文件的窗口;关闭窗口并释放该窗口所分配的全部内存(包括窗口内部的图像内存缓区:保存了与img指针相关的图像文件像素的一个副本)。
    • 当应用程序的窗口被关闭时,该应用程序窗口所占用的一切资源都会由操做系统自动释放,因此对一些简单的程序,没必要调用cvDestroy()或cvReleaseImage()函数显式释放资源。可是,养成习惯每次都调用这些函数显式释放资源老是好的
  7. cvMoveWindow(“win1”,int x,int y)

    • 移动win1窗口到指定的坐标(x,y)位置
    • 默认显示屏左上角为原点;x,y:为偏移位置
  8. cvResizeWindow(“win1”,int width,int height)

    • 设定窗口尺寸为指定宽度和高度
    •   设定的窗口尺寸是指显示图像的窗口尺寸,不包含拖动条
    • 只有建立的窗口flag属性不为CV_WINDOW_AUTOSIZE时才可以调用此函数
  9. cvGetSize(const CvArr* arr)

    • 函数返回输入矩阵或者图像arr的行数和列数;当为图像时返回感兴趣区域的尺
  10. cvCreateImage(CvSize size,int depth,int channels)
      • 建立图像头而且分配图像数据;返回IplImage结构
      • size:图像的宽度和高度;depth:图像像素的位深度;channels:图像的通道数
      • 位深度:可使有的选择以下:

    IPL_DEPTH_8U:无符号8bit整型

    IPL_DEPTH_8S:无符号8bit整型

    IPL_DEPTH_16U:无符号16bit整型

    IPL_DEPTH_16S:有符号16bit整型

    IPL_DEPTH_32S:有符号32bit整型

    IPL_DEPTH_32F:单精度浮点数

    IPL_DEPTH_64F:双精度浮点数

  11. cvCopy(const CvArr* src,const CvArr* dst,const CvArr* mask)

    • 函数复制一个数组数据到另外一个数组中
    • src:源输入数组;dst:输出数组;mask:操做掩码,必须为8位单通道数组,指定输出数组的被改变元素
    • dst(i) = src(i) if mask(i) != 0
    • 输入输出数组必须为同类型,维数大小相同;若是是IplImage类型,则ROI和COI将被使用
  12. cvSaveImage(const char* filename,const CvArr* Image)

    • 保存图像Image到指定文件filename

附源代码:

#include "stdafx.h"
#include "highgui.h"

int main(int argc, char** argv)
{
    IplImage* pImg;                         //声明IplImage指针

    if(argc == 2 && (pImg = cvLoadImage(argv[1],1)) !=  0)     //当(“输入两个字符串”而且“成功读入图片”)时
        {
        cvNamedWindow("Image",1);          //建立标题为Image的窗口,而且随实际图片大小改变窗口尺寸
        cvShowImage("Image",pImg);          //在Image窗口内显示pImg指针所指图像
        cvWaitKey();                        //等待按键
        cvDestroyWindow("Image");           //销毁窗口
        cvReleaseImage(&pImg);              //释放图像
        return 0;
        }

    else if(argc == 3 && (pImg = cvLoadImage(argv[1],1)) !=  0)    //当(“输入三个字符串”而且“成功读入图片”)时
        {
        IplImage* pImg2 = cvCreateImage(cvGetSize(pImg),pImg->depth,pImg->nChannels);  //以图像pImg的格式建立图像pImg2
        cvCopy(pImg,pImg2,NULL);          //复制pImg图像数据到pImg2
        cvSaveImage(argv[2],pImg2);       //把图像pImg2写入以输入第三个字符串为名字的文件中
        cvNamedWindow("Image",1);          //建立窗口
        cvShowImage("Image",pImg);         //显示图像
        cvWaitKey(0);                      //等待按键
        cvDestroyWindow("Image");          //销毁窗口
        cvReleaseImage(&pImg);             //释放图像
        return 0 ;
        }
    return -1;
}
相关文章
相关标签/搜索