分为:硬件相关部分,文件部分以及图形用户接口部分
创建窗口 —— cvNamedWindow
若设置成 CV_WINDOW_AUTOSIZE 窗口大小会随着图像的载入而根据图像大小调整,用户没办法手动调整窗口大小
设置成 0 ,随意调整
cvDestoyWindow cvDestroyAllWindows
cvGetWindowHandle cvGetWindowName
cvLoadImage 读入16位的彩色图像 —— CV_LOAD_IMAGE_COLOR | CV_LOAD_IMAGE_ANYDEPTH
鼠标事件相应采用回调函数的方式处理
CvMouseCallback
cvSetMouseCallback —— 注册到窗口(产生事件的窗口)
#include <cv.h> #include <highgui.h> CvRect box; bool drawing_box = false; void my_mouse_callback(int event,int x,int y,int flags,void* param); void draw_box(IplImage* img,CvRect rect) { cvRectangle(img,cvPoint(box.x,box.y),cvPoint(box.x+box.width,box.y+box.height),cvScalar(0xff,0x00,0x00)); } int main(int argc,char** argv) { box=cvRect(-1,-1,0,0); IplImage* img=cvCreateImage(cvSize(200,200),IPL_DEPTH_8U,3); cvZero(img); IplImage* temp=cvCloneImage(img); cvNamedWindow("w1"); cvSetMouseCallback("w1",my_mouse_callback,(void*)img); while(1) { cvCopyImage(img,temp); if(!drawing_box) draw_box(temp,box); cvShowImage("w1",temp); if(cvWaitKey(15)==27) break; } cvReleaseImage(&img); cvReleaseImage(&temp); cvDestroyWindow("w1"); return 0; } void my_mouse_callback(int event,int x,int y,int flags,void* param) { IplImage* img=(IplImage*)param; switch(event) { case CV_EVENT_MOUSEMOVE: { if(drawing_box) { box.width=x-box.x; box.height=y-box.y; } } break; case CV_EVENT_LBUTTONDOWN: { drawing_box=true; box=cvRect(x,y,0,0); } break; case CV_EVENT_LBUTTONUP: { drawing_box=false; if(box.width<0) { box.x+=box.width; box.width*=-1; } if (box.height<0) { box.y+=box.height; box.height*=-1; } draw_box(img,box); } break; } }
sliders —— trackbar 滑动条 cvCreateTrackbar 回调函数
cvGetTrackbarPos cvSetTrackbarPos —— 读取设置滑动条的取值
OpenCV 不提供任何形式的按钮,用只有两个状态的滑动条来代替
#include <cv.h> #include <highgui.h> int g_switch_value =0; IplImage* img; IplImage* temp; void Switch_callback(int position) { if(position==0) { cvShowImage("w1",img); }else { cvShowImage("w1",temp); } } int main(int argc,char** argv) { cvNamedWindow("w1",CV_WINDOW_AUTOSIZE); cvCreateTrackbar("Switch","w1",&g_switch_value,1,Switch_callback); img=cvLoadImage("wukong.jpg",CV_LOAD_IMAGE_UNCHANGED); temp=cvLoadImage("test.jpg",CV_LOAD_IMAGE_UNCHANGED); while(1) { if (cvWaitKey(15)==27) break; } cvDestroyWindow("w1"); return 0; }
视频处理
CvCapture —— 从摄像机或视频文件中读取帧所需要的信息
cvCreateFileCapture cvCreateCameraCapture —— 为了使视频可以被成功读入,必须确保这种视频解码库已经安装在系统中
cvCreateCameraCapture -1 时,Opencv会打开一个窗口让用户选择
读视频
cvGrabFrame(快速将视频帧读入内存,下一次调用时,指针所指向的空间会被新的图像覆盖,如果想做特殊处理需要先复制到其他地方。此内存空间由Opencv管理,不要去释放) cvRetrieveFrame cvQueryFrame(是cvGrabFrame 与 cvRetrieveFrame 的组合)
对一个视频文件,当调用 cvGrabFrame ,视频帧会自动前进一步,下一次调用会自动读入下一帧视频
cvReleaseCapture
cvGetCaptureProperty
cvVideoWriter 写视频 —— 不显式地释放写入结构,视频文件可能会被损坏 —— cvReleaseVideoWriter
HighGUI 中茕茕孑立的一个函数 —— ConvertImage (用于在不同图像格式之间转换 , 可以垂直旋转图像 —— 有时候摄像机图像格式与图像显示格式会反转)