2008年6月30日 星期一

OpenCV繪圖的實作-cvCircle,cvEllipse,cvEllipseBox

圓的製作,要給他目標圖片,圓心座標,半徑,其他參數等.

cvCircle()函式的實作
#include <cv.h>
#include <highgui.h>

IplImage *Image1;

CvPoint CircleCenter;
int Radius;
CvScalar Color;
int Thickness;
int Shift;

int main()
{
    CvSize ImageSize1 = cvSize(1000,700);
    Image1 = cvCreateImage(ImageSize1,IPL_DEPTH_8U,3);

    CircleCenter=cvPoint(500,350);
    Radius=300;
    Color=CV_RGB(255,0,0);
    Thickness=3;

    cvCircle(Image1,CircleCenter,Radius,Color,Thickness,CV_AA,Shift);

    cvNamedWindow("Circle",1);
    cvShowImage("Circle",Image1);
    cvWaitKey(0);
}

執行結果:


執行出來的結果會是一個座標(500,300),半徑300的紅色圓形.

cvCircle()
繪出圓形的函式,需要給它目標圖形IplImage資料結構,CvPoint圓心座標,半徑長度,CvScalar顏色,粗細,線條種類,縮放比例數據.
cvCircle(IplImage資料結構,CvPoint圓心座標,半徑數據,CvScalar顏色,粗細數據,線條種類,縮放比例數據)




橢圓形,用的是cvEllipse()的函式,這個繪圖也很特殊,可以用橢圓函式畫弧線,需要用到的是,目標圖形IplImage資料結構,橢圓圓心,橢圓長短軸,橢圓旋轉角度,繪製起點(角度),繪製終點(角度)及其他參數.

cvEllipse()函式的實作
#include <cv.h>
#include <highgui.h>

IplImage *Image1;
CvPoint CircleCenter;
CvSize EllipseAxes;
double RotateAngle;
double StartDrawingAngle;
double StopDrawingAngle;
CvScalar Color;
int Thickness;
int Shift;

int main()
{
    CvSize ImageSize1 = cvSize(1000,700);
    Image1 = cvCreateImage(ImageSize1,IPL_DEPTH_8U,3);

    CircleCenter=cvPoint(500,400);
    EllipseAxes=cvSize(300,200);
    RotateAngle=0;
    StartDrawingAngle=0;
    StopDrawingAngle=360;
    Color=CV_RGB(255,0,0);
    Thickness=2;
    Shift=0;

    cvEllipse(Image1,CircleCenter,EllipseAxes,RotateAngle,
                 StartDrawingAngle,StopDrawingAngle,Color,Thickness,CV_AA,Shift);

    cvNamedWindow("Ellipse",1);
    cvShowImage("Ellipse",Image1);
    cvWaitKey(0);
}

執行結果:
(1)RotateAngle=0,StartDrawingAngle=0,StopDrawingAngle=360


(2)修改為RotateAngle=70,StartDrawingAngle=100,StopDrawingAngle=360


上面的執行結果,第一張是標準的橢圓,給它圓心,長短軸半徑,旋轉角度,繪圖起點,繪圖終點,顏色,粗細,線條種類,縮放比例,而弧線的部份,修改了旋轉角度,繪圖起點跟繪圖終點,如果繪圖起點是0~360那就一定是橢圓了,只要他的角度不會繞一圈,愛畫怎樣的弧線都行.

cvEllipse()
可以繪橢圓跟弧線,需要用到目標圖形IplImage資料結構,CvSize長短軸半徑,旋轉角度數據,繪圖起點,繪圖終點的角度數據,CvScalar顏色,粗細數據,線條種類,縮放比例.
cvEllipse(IplImage資料結構,CvSize長短軸,旋轉角度數據,繪圖起點角度,繪圖終點角度,CvScalar顏色,粗細數據,線條種類,縮放比例數據)




下面的這個跟cvEllipse()很像,但是他是屬於OpenCV演算法專用的繪圖函數,可以藉由一個方框來繪製橢圓,利用ROI(Region Of Interest)的方式,OpenCV的應用上有cvCamShift,cvMinAreaRect,cvFitEllipse等.

cvEllipseBox()函式的實作
#include <cv.h>
#include <highgui.h>


IplImage *Image1;
CvBox2D Box1;
CvScalar Color;
int Thickness;
int Shift;

int main()
{
    CvSize ImageSize1 = cvSize(1000,700);
    Image1 = cvCreateImage(ImageSize1,IPL_DEPTH_8U,3);

    Box1.center=cvPoint2D32f(500,400);
    Box1.size=cvSize2D32f(300,200);
    Box1.angle=70;
    Color=CV_RGB(255,0,0);
    Thickness=2;
    Shift=0;

    cvEllipseBox(Image1,Box1,Color,Thickness,CV_AA,Shift);

    cvNamedWindow("EllipseBox",1);
    cvShowImage("EllipseBox",Image1);
    cvWaitKey(0);
}

執行結果:


這邊可輸入的參數少了,也只能單純的話橢圓,然後讓他旋轉,其他功能都與cvEllipse()類似,而圓心,長短軸長度,旋轉角度,都以CvBox資料結構來代替,OpenCV的演算法也拿CvBox的方框來實作出橢圓.

cvEllipseBox()
給定目標IplImage資料結構,在給它方框CvBox資料結構,藉由方框資料結構的參數繪出橢圓,在給定線條粗細,線條種類,縮放比例大小等數據
cvEllipseBox(IplImage資料結構,CvBox方框資料結構,CvScalar顏色,線條粗細數據,線條種類,縮放比例大小數據)



4 意見:

匿名 提到...

你好,看了你的画椭圆的程序,受益匪浅,我现在想完成反向功能,单独保存图片上面的椭圆区域为图片,我该如何获得区域的坐标并保存下来呢,谢谢~~~~~

Chen Yuan 提到...
作者已經移除這則留言。
Chen Yuan 提到...
作者已經移除這則留言。
匿名 提到...

請教一下
如果我有一個圖的資料型態是 cv::Mat
我要如何讓這張圖可以使用cvCircle
cvCircle 看起來似乎只能使用cvArr的資料型態
謝謝

Copyright 2008-2009,yester