首页 > OPENCV > OPENCV笔记

OPENCV笔记

2012年8月2日 发表评论 阅读评论

滑动条:
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 标签: ,
  • 提问!学 OpenCV 有必要会写 GUI 程序吗?

    • 回答!没必要。。OPENCV主要是用于图像处理算法,不是做GUI用的