一:图像显示
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:窗口名
Flags:CV_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=cvWaitKey(33):
当前帧被显示后,等待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_name,char *window_name,Int 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:图像的宽和高,可以通过cvGetSize(img_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_BLUR,CV_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。