openCV入门学习

一:图像显示


1. IplImage* cvLoadImage( const char* filename, int flags=CV_LOAD_IMAGE_COLOR );

 

Filename:文件名或者文件路径

Flags指定读入图像的颜色和深度

/* 8bit, color or not */

    CV_LOAD_IMAGE_UNCHANGED  =-1,

/* 8bit, gray */

    CV_LOAD_IMAGE_GRAYSCALE  =0,

/* ?, color */

    CV_LOAD_IMAGE_COLOR      =1,

/* any depth, ? */

    CV_LOAD_IMAGE_ANYDEPTH   =2,

/* ?, any color */

    CV_LOAD_IMAGE_ANYCOLOR   =4

 

2. int cvNamedWindow( const char* name, int flags=CV_WINDOW_AUTOSIZE );

 

Name:窗口名

FlagsCV_WINDOW_AUTOSIZE=1这个标志被设置后, 如果用户不能手动改变窗口大小,窗口大小会自动调整以适合被显示图像。

0表示以固定的窗口尺寸显示图像。

 

图像显示代码:

#include "highgui.h"

#include "cv.h"

#include "cxcore.h"

 

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

IplImage *src =cvLoadImage("F:\\pic.jpg",1);

cvNamedWindow("show_image",1);

cvShowImage("show_image",src);

cvWaitKey(0);

 

cvReleaseImage(&src);

cvDestroyWindow("show_image");

return 0;

}

 

 

 

 

 

 

二:读取视频文件  注意安装解码器 如xvid

 

CvCapture:是一个结构体,用来保存图像捕获所需要的信息。

 

openCV提供了两种方式从外部捕获图像。

一种是从摄像头中

一种是通过解码视频得到图像

这两种方式都必须从第一帧开始一帧一帧的按顺序获取,因此每获取一帧都要保存相应的状态和参数。比如从视频文件中获取,需要保存视频文件的路径文件名,相应的解码器类型,下一次如果要获取将需要解码哪一帧等。这些信息都保存在CvCapture结构体中,每获取一帧后,这些信息都将被更新,获取下一帧需要将新信息传给获取的api接口。

 

 

cvQureyFrame(capture):

输入一个CvCapture类型的指针,该函数主要功能是将视频文件的下一帧加载到内存。与cvLoadImage不同的是,该函数不重新分配内存空间。

 

 

C=cvWaitKey33):

当前帧被显示后,等待33毫秒。如果用户触发了一个按键,c会被设置成这个按键的ASCII值,否则会被设置成-1

cvWaitKey(33)在此处的另一个作用是控制频率。

 

cvCreateFileCapture(int ):

该函数的输入参数是一个ID号,只有存在多个摄像头时才起作用。当ID=-1时,表示随机选择一个。

 

读取视频代码:

#include "highgui.h"

#include "cv.h"

#include "cxcore.h"

 

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

cvNamedWindow("veido");

//读视频

CvCapture * capture=cvCreateFileCapture("F:\\1.avi");

//读摄像头

// CvCapture * capture=cvCreatCameraCapture(-1);

IplImage *frame;

while(1)

{

frame =cvQueryFrame(capture);

if(!frame)break;

cvShowImage("veido",frame);

char c=cvWaitKey(33);

if(c==27) break;

}

cvReleaseCapture(&capture);

cvDestroyWindow("veido");

return 0;

}

 

常见问题:

1)视频文件路径问题

2)没有安装解码器

3)如果使用openCV2.0或者更高版本,那么,能否正确加载opencv_ffmpeg210.dll,比如你的exe文件在你当前机器可以运行,但考到其他机器不能运行情况。

4)尽管是AVI文件,但也可能使用了某种codec,例如:MJPEG Decompressor。需要把它转换成openCV支持的AVI文件。

5)读取摄像头数据时,需要安装与摄像头相应的驱动程序。

 

 

 

 

 

三:视频控制功能

 

#include "highgui.h"

#include "cv.h"

 

int g_slider_position =0;

CvCapture *g_capture=NULL;

int n=0;

void onTrackbarSlide(int pos){

cvSetCaptureProperty(

g_capture,

CV_CAP_PROP_POS_FRAMES,

pos

);

n=pos;

}

 

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

cvNamedWindow("vedioC",CV_WINDOW_AUTOSIZE);

g_capture=cvCreateFileCapture("F:\\1.avi");

int frames=(int)cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_COUNT);

 

if(frames>0){

cvCreateTrackbar("position","vedioC",&g_slider_position,frames,onTrackbarSlide);

}

IplImage *frame;

while(1){

frame=cvQueryFrame(g_capture);

if(!frame) break;

cvShowImage("vedioC",frame);

cvSetTrackbarPos( "position""vedioC", n++ );   

char c =cvWaitKey(24);

if(c==27) break;

 

}

 

cvReleaseCapture(&g_capture);

cvDestroyWindow("vedioC");

 

}

 

Double cvGetCaptureProperty(CvCapture *capture,int property_id)

获取视频的某些参数

CV_CAP_PROP_POS_MSEC: 影片目前位置,为毫秒数或者视频获取时间戳

CV_CAP_PROP_POS_FRAMES:将被下一步解压/获取的帧索引,以0为起点

CV_CAP_PROP_POS_AVI_RATIO:视频文件的相对位置(0-影片开始,1-影片结尾)

CV_CAP_PROP_FRAME_WIDTH: 视频流中的帧宽度

CV_CAP_PROP_FRAME_HEIGHT:视频流中的帧高度

CV_CAP_PROP_FRAME_COUNT:视频文件中的帧的总数

CV_CAP_PROP_FPS:帧率

CV_CAP_PROP_FOURCC:表示codec的四个字符

 

Int cvCreateTrackbar*(char *trackbar_namechar *window_nameInt position,int count,CvTrackCallback on_change)

创建一个滚动条。参数分别为:滚动条名,所属窗口名,当前位置,总帧数,回调函数

 

 

 

 

 

四  图像的平滑处理


#include "highgui.h"

#include "cv.h"

 

 

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

cvNamedWindow("img_in",1);

cvNamedWindow("img_out",1);

IplImage * img_in=cvLoadImage("F:\\pic.jpg");

cvShowImage("img_in",img_in);

 

IplImage *img_out=cvCreateImage(cvGetSize(img_in),IPL_DEPTH_8U,3);

cvSmooth(img_in,img_out,CV_GAUSSIAN,3,3);

cvShowImage("img_out",img_out);

 

cvReleaseImage(&img_in);

cvReleaseImage(&img_out);

cvWaitKey(0);

cvDestroyWindow("img_in");

cvDestroyWindow("img_out");

 

}

 

IplImage* cvCreateImage( CvSize size, int depth, int channels );

用来创建一张空图片来存储平滑处理之后的图像

其中

Size:图像的宽和高,可以通过cvGetSizeimg_in)简单获得。

Depth:图像元素的位深度

IPL_DEPTH_8U - 无符号8整型

IPL_DEPTH_8S - 有符号8位整型

IPL_DEPTH_16U - 无符号16位整型

IPL_DEPTH_16S - 有符号16位整型

IPL_DEPTH_32S - 有符号32位整型

IPL_DEPTH_32F - 单精度浮点数

IPL_DEPTH_64F - 双精度浮点数

 

channels :说明了通道的总数

 

 

Void cvSmooth(const CvArr* src,VcArr *dst,int smoothtype,int arg1,int arg2)

Src:输入图像

Dst:输出图像

Smoothtype:平滑方法 可选: CV_BLUR_NO_SCALE CV_BLURCV_GAUSSIAN CV_MEDIAN CV_BILATERA

 

 

五:缩放图像

 

#include "highgui.h"

#include "cv.h"

 

 

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

cvNamedWindow("test",1);

cvNamedWindow("test1",1);

IplImage *in=cvLoadImage("F:\pic.jpg");

cvShowImage("test",in);

IplImage *out=cvCreateImage(cvSize(in->width/2,in->height/2),in->depth,in->nChannels);

cvPyrDown(in,out);

cvShowImage("test1",out);

 

cvWaitKey(0);

cvReleaseImage(&in);

cvReleaseImage(&out);

cvDestroyWindow("test1");

cvDestroyWindow("test");

}

 

首先创建一个空图像out,其参数根据需要进行设置,然后通过cvPyrDown()函数将输入图像in 具体赋值到空图像out

 

 

你可能感兴趣的:(openCV,opencv)