OPENCV笔记
滑动条:
cvCreateTrackbar(滑动条名字,窗口名, 起始位置, 最大值, 回调函数);
cvSetTrackbarPos(滑动条名字,窗口名,pos);
回调函数:void F(int h)
=================================================
ROI:
void cvSetImageROI(IplImage* image, CvRect rect);
void cvResetImageROI(IplImage* image);
vRect cvGetImageROI(const IplImage* image);
=================================================
颜色转换:
cvCvtColor(src,dst,code);
code = CV_<X>2<Y>
<X>/<Y> = RGB, BGR, GRAY, HSV, YCrCb, XYZ, Lab, Luv, HLS
e.g.: CV_BGR2GRAY, CV_BGR2HSV, CV_BGR2Lab
=================================================
摄像头:
CvCapture* XXX = 0;
XXX = cvCaptureFromCAM(0);
frame = cvQueryFrame(xxx);
=================================================
读视频流:
capture = cvCaptureFromFile(“xxx.avi”);
capture = cvCaptureFromAVI(“XXX.avi”);
=================================================
鼠标回调函数:
void on_mouse( int event, int x, int y, int flags, void* param ) { switch( event ) { case CV_EVENT_LBUTTONDOWN: break; case CV_EVENT_LBUTTONUP: break; case CV_EVENT_MOUSEMOVE: if (flags == CV_EVENT_FLAG_LBUTTON) { } break; } }
cvSetMouseCallback(WINDOW_NAME, on_mouse, 0 );
=================================================
显示文字:
CvFont font; double hScale=1.0; double vScale=1.0; int lineWidth=1; cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX|CV_FONT_ITALIC, hScale,vScale,0,lineWidth); cvPutText (img,"My comment",cvPoint(200,400), &font, cvScalar(255,255,0));
=================================================
头文件包含:
#ifdef _DEBUG #pragma comment ( lib, "cxcore200d.lib" ) #pragma comment ( lib, "cv200d.lib" ) #pragma comment ( lib, "highgui200d.lib" ) #else #pragma comment ( lib, "cxcore200.lib" ) #pragma comment ( lib, "cv200.lib" ) #pragma comment ( lib, "highgui200.lib" ) #endif #include "cv.h" #include "highgui.h"
=================================================
Mat类型较CvMat和IplImage有更强的矩阵运算能力,支持常见的矩阵运算(参照Matlab中的各种矩阵运算),所以将IplImage类型和CvMat类型转换为Mat类型更易于数据处理。
Mat类型可用于直接存储图像信息,通过函数imread、imwrite、imshow等实现(与Matlab中的函数相似),似乎在某种程度上可以取代IplImage类型。
(1)将IplImage类型转换到Mat类型
Mat::Mat(const IplImage* img, bool copyData=false);
默认情况下,新的Mat类型与原来的IplImage类型共享图像数据,转换只是创建一个Mat矩阵头。当将参数copyData设为true后,就会复制整个图像数据。
例:
IplImage* iplImg = cvLoadImage(“greatwave.jpg”, 1);
Mat mtx(iplImg); // IplImage* ->Mat 共享数据
// or : Mat mtx = iplImg;
(2)将Mat类型转换到IplImage类型
同样只是创建图像头,而没有复制数据。
例:
IplImage ipl_img = img; // Mat -> IplImage
(3)将CvMat类型转换为Mat类型
与IplImage的转换类似,可以选择是否复制数据。
Mat::Mat(const CvMat* m, bool copyData=false);
(4)将Mat类型转换为CvMat类型
与IplImage的转换类似,不复制数据,只创建矩阵头。
例:
// 假设Mat类型的imgMat图像数据存在
CvMat cvMat = imgMat; // Mat -> CvMat
=================================================
CV_IMAGE_ELEM(frame,uchar,y,x);
=================================================
要先开辟新内存:
void cvCopyImage( const CvArr* src, CvArr* dst, const CvArr* mask=NULL );
可以直接用:
img2=cvCloneImage(img1);
=================================================
二值化:
void cvThreshold( const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type );
src原始数组 (单通道 , 8-bit of 32-bit 浮点数).
dst输出数组,必须与 src 的类型一致,或者为 8-bit.
threshold阈值
max_value使用CV_THRESH_BINARY 和 CV_THRESH_BINARY_INV 的最大值
threshold_type:
threshold_type=CV_THRESH_BINARY:
dst(x,y) = max_value, if src(x,y)>threshold 0, otherwise.
threshold_type=CV_THRESH_BINARY_INV:
dst(x,y) = 0, if src(x,y)>threshold; dst(x,y) = max_value, otherwise.
threshold_type=CV_THRESH_TRUNC:
dst(x,y) = threshold, if src(x,y)>threshold; dst(x,y) = src(x,y), otherwise.
threshold_type=CV_THRESH_TOZERO:
dst(x,y) = src(x,y), if (x,y)>threshold ; dst(x,y) = 0, otherwise.
threshold_type=CV_THRESH_TOZERO_INV:
dst(x,y) = 0, if src(x,y)>threshold ; dst(x,y) = src(x,y), otherwise.
提问!学 OpenCV 有必要会写 GUI 程序吗?
回答!没必要。。OPENCV主要是用于图像处理算法,不是做GUI用的