1. 程式人生 > >OpenCV繪圖之多邊形函式cvFillPoly,cvPolyLine,cvFillConvexPoly

OpenCV繪圖之多邊形函式cvFillPoly,cvPolyLine,cvFillConvexPoly


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中除錯並執行成功):

這就算是我的第一篇文章了。。。。。。。。。。。。。。。。。。奮鬥(以上所有內容均不能保證完全正確,只是自己在學習中的一點體會罷了).