您的位置:首页 > 运维架构

OpenCV绘图之多边形函数cvFillPoly,cvPolyLine,cvFillConvexPoly

2013-10-08 01:06 369 查看
 


OpenCV绘图函数之多边形

今天学习了OpenCV中的绘制多边形的相关函数-cvFillPoly,cvFillConvexPoly,cvPolyLine.现将其用法总结如下,权当做是对今天学习的总结吧~(@^_^@)~

先来介绍一下这三个函数吧:

cvFillPoly:(绘制好多边形后并填充(fill是填充的意思,Polygon是多边形的意思))函数原型如下:

void cvFillPoly(CvArr * img,
CvPoint ** pts,
int * npts,
int contours,
CvScalar color,
int line_type = 8);
 
    该函数的参数比较长,现在来详细解释器参数的意义和其用法,首先是cvArr * img表示加载一幅图像,CvArr是一个基类,CvMat和IplImage都可以转化为CvArr类型,好吧我们还是来说一下重点CvPoint ** pts,这个参数可以说是由CvPoint结构组成的二维数组,学过c语言的都知道二维数组其实就是特殊的一位数组,比如说CvPoint [2][4],可以这样理解:这个二维数组是由两个元素组成即CvPoint[0][4],
CvPoint[1][4].再仔细看每个元素是由4个子元素构成的。为什么要这么分析呢?其实这样分析就是为了回答一个问题:为什么pts要被定义成二级指针?那是因为cvFillPoint函数能够一次绘制多个多边形,所以它用一维数组(一个行指针)存储一个多边形的点,用另一个一位数组(另一个行指针)存储另一个多边形的点,这样就可以实现用一个二维数组来存储多个多边形的点啦。int * npts与上一个参数相对应,即每一个多边形包含了多少个点,可能你会问当CvPoint定义了一个二维数组之后不是每个多边形有多少个点就已经确定了吗?我认为我们每一个多边形的描绘可能需要不同个数的点来确定,而用CvPoint来定义显然有些不妥,所以就用了npts来加以调节,我不知道我的观点是不是正确的,也没有调试测试,但这个想法肯定设计者是考虑到了的。另外一个就是int
contours参数,在我看来该参数就是设定你要画的多边形的个数,当然如果你定义的CvPoint数组的行数(也就是多边形的个数,因为一个行指针对应一个多边形嘛)为n,那么contours就应该小于等于n(调试验证过),其他参数应该没什么了。

void cvFillConvexPoly(CvArr * img,
CvPoint * pts,
int npts,
CvScalar color,
int line_type = 8);

    大家肯定注意到了这两个函数的参数的差别了,其实原因在于,这个函数执行一次智能画出一个多边形,所以它根本就没有int contours参数项,还有CvPoint * pts变成了一级指针。好吧,我们来看另一个函数:

void cvPolyLine(CvArr * img,
CvPoint ** pts,
int * npts,
int contours,
int is_closed,
CvScalar color,
int thickness = 1,
int line_type = 8);

    这个函数与第一个函数相比的差别是:这个函数只关心多变形的边,也就是说它只描绘出多边形的边,还有就是is_closed参数用来判断多边形是否封闭.

注意:以上函数使用时要注意点的顺序.

测试代码:

/* 探究多变形绘图函数 */
#include <highgui.h>
#include <cv.h>

int main()
{
/* 创建一个空图 */
CvSize size = cvSize(400, 400);
IplImage * testImage = cvCreateImage(size, IPL_DEPTH_8U, 3);
for(int y = 0; y < testImage->height; y++){
unsigned char * Pout = (unsigned char *)(testImage->imageData + y * testImage->widthStep);
for(int x = 0; x < testImage->width; x++){
Pout[3 * x + 0] = 255;
Pout[3 * x + 1] = 255;
Pout[3 * x + 2] = 255;
}
}
/* 创建画图的相关参数 */
CvPoint** point1 = new CvPoint* [2];
point1[0] = new CvPoint[3];
point1[1] = new CvPoint[4];
point1[0][0] = cvPoint(200, 40); /* 三角形的点的相关信息 */
point1[0][1] = cvPoint(150, 80);
point1[0][2] = cvPoint(250, 80);
point1[1][0] = cvPoint(150, 100); /* 正方形的相关信息 */
point1[1][1] = cvPoint(250, 100);
point1[1][2] = cvPoint(250, 200);
point1[1][3] = cvPoint(150, 200);
int npts[2] = {3, 4};/* 三角形有三个有效点正方形有四个有效点 */
CvScalar color = cvScalar(200, 100, 250);/* 颜色参数 */
cvFillPoly(testImage, point1, npts, 2, color);

CvPoint** point2 = new CvPoint* [2];
point2[0] = new CvPoint[3];
point2[1] = new CvPoint[4];
point2[0][0] = cvPoint(100, 40);
point2[0][1] = cvPoint(50, 80);
point2[0][2] = cvPoint(150, 80);
point2[1][0] = cvPoint(50, 100);
point2[1][1] = cvPoint(150, 100);
point2[1][2] = cvPoint(150, 200); /* 参数的相关含义如上 */
point2[1][3] = cvPoint(50, 200);
cvPolyLine(testImage, point2, npts, 2, 1, color);/* PolyLine 函数的使用*/

cvNamedWindow("show");
cvShowImage("show", testImage);
cvWaitKey(0);

cvReleaseImage(&testImage);/* 释放相关资源 */
cvDestroyAllWindows();
return 0;

}

改程序执行结果如下图所示(本程序在VS2012中调试并运行成功):



这就算是我的第一篇文章了。。。。。。。。。。。。。。。。。。

(以上所有内容均不能保证完全正确,只是自己在学习中的一点体会罢了).

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息