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

OpenCV学习之图像读取与显示

2013-05-19 15:27 513 查看
  

  距离上一次简单介绍VS2010配置OpenCV2.4.0好久了,今天打算讲图像读取与显示。

  在讲各种操作之前,先来了解OpenCV的一些基础知识:

1、OpenCV的特点

(1) 总体描述

OpenCV是一个基于C/C++语言的开源图像处理函数库

其代码都经过优化,可用于实时处理图像

具有良好的可移植性

可以进行图像/视频载入、保存和采集的常规操作

具有低级和高级的应用程序接口(API)

提供了面向Intel IPP高效多媒体函数库的接口,可针对你使用的Intel CPU优化代码,提高程序性能(译注:OpenCV 2.0版的代码已显着优化,无需IPP来提升性能,故2.0版不再提供IPP接口)

(2) 功能

图像数据操作(内存分配与释放,图像复制、设定和转换)

Image data manipulation (allocation, release, copying, setting, conversion).

图像/视频的输入输出(支持文件或摄像头的输入,图像/视频文件的输出)

Image and video I/O (file and camera based input, image/video file output).

矩阵/向量数据操作及线性代数运算(矩阵乘积、矩阵方程求解、特征值、奇异值分解)

Matrix and vector manipulation and linear algebra routines (products, solvers, eigenvalues, SVD).

支持多种动态数据结构(链表、队列、数据集、树、图)

Various dynamic data structures (lists, queues, sets, trees, graphs).

基本图像处理(去噪、边缘检测、角点检测、采样与插值、色彩变换、形态学处理、直方图、图像金字塔结构)

Basic image processing (filtering, edge detection, corner detection, sampling and interpolation, color conversion, morphological operations, histograms, image pyramids).

结构分析(连通域/分支、轮廓处理、距离转换、图像矩、模板匹配、霍夫变换、多项式逼近、曲线拟合、椭圆拟合、狄劳尼三角化)

Structural analysis (connected components, contour processing, distance transform, various moments, template matching, Hough transform, polygonal approximation, line fitting, ellipse fitting, Delaunay triangulation).

摄像头定标(寻找和跟踪定标模式、参数定标、基本矩阵估计、单应矩阵估计、立体视觉匹配)

Camera calibration (finding and tracking calibration patterns, calibration, fundamental matrix estimation, homography estimation, stereo correspondence).

运动分析(光流、动作分割、目标跟踪)

Motion analysis (optical flow, motion segmentation, tracking).

目标识别(特征方法、HMM模型)

Object recognition (eigen-methods, HMM).

基本的GUI(显示图像/视频、键盘/鼠标操作、滑动条)

Basic GUI (display image/video, keyboard and mouse handling, scroll-bars).

图像标注(直线、曲线、多边形、文本标注)

Image labeling (line, conic, polygon, text drawing)
(3) OpenCV模块

cv – 核心函数库

cvaux – 辅助函数库

cxcore – 数据结构与线性代数库

highgui – GUI函数库

ml – 机器学习函数库

  基础内容很多,讲到这里可以知道相应操作需要添加哪些头文件。更多具体的知识可见——

   http://www.opencv.org.cn/index.php/%E9%A6%96%E9%A1%B5

  图像读取与显示应该是OpenCV中最基础的操作,需要cv.h,highgui.h,具体先见下面代码(假设您已经配置好并对其了解):

#include "cv.h"
#include "highgui.h"

int main()
{
IplImage *img = cvLoadImage("lena.jpg",1);

cvNamedWindow("lena",1);

cvShowImage("lena",img);

cvWaitKey(0);

cvReleaseImage(&img);

cvDestroyWindow("lena");

return 0;
}


  解释:

  1、IplImage为图像结构;

  2、cvLoadImage(filename,n),读图像文件(filename为双引号括起的图像名,n为1时强转为彩色图,0转为灰度图,-1为原来的值);

  3、cvNamedWindow(window_name,n),创建名为window_name的窗口,用于显示图像(n为1表示窗口大小随图像改变,0则相反);

  4、cvShowImage(win_name,img_name),将图像img_name显示在窗口win_name中,若win_name事先未定义则此时完成定义;

  5、cvWaitKey(time),若time为0则在用户没有动作之前一直显示着上面的图像,也可以设置time为别的值(单位为毫秒),这样时间一到就关闭窗口;

  6、cvReleaseImage(&img_name),释放图像img_name的内存;

  7、cvDestroyWindow(window_name),销毁创建的窗口,还有一个函数为cvDestroyAllWindows(),会关闭所有之前创建的窗口,因此在多窗口的情形下只需调用一次;

  通过代码可以看出,如果不需要进行C++中单独的操作,没有出现任何和OpenCV无关的东西。

  当然上述代码在C++中还可以是另外一个版本,如图像读取可以用imread(img_name),显示可以是imshow(window_name,img_name),等。这些在上面给出的网址主页上都有提及。

  目前,OpenCV结合C/C++,Matlab等对图像处理的功能日益强大,个人认为其未来的前景与地位会越来越显著。

  现在还处在初学阶段,望喜欢OpenCV编程(图像处理的更好)的朋友一起交流,进步!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: