2008年6月29日 星期日

OpenCV字型的實作-CvFont製作

字型的部份,用到的是CvFont資料結構,在"cxcore.h"的函式庫裡,它有許多的參數可以設定,專門的功能是在圖片上顯示文字訊息,也可以應用在視訊播放等功能.

字型及輸出文字程式設計
#include <cv.h>
#include <highgui.h>


IplImage *Image1;
double Scale;
int Thickness;
CvScalar Color;

int FontFace;
double HorizontalScale;
double VerticalScale;
double Shear;
int LineType;
CvPoint TextPosition1,TextPosition2,TextPosition3;

int main()
{

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

    Scale=1;
    Thickness=1;

    CvFont Font1=cvFont(Scale,Thickness);

    TextPosition1=cvPoint(200,300);
    Color=CV_RGB(255,0,0);

    cvPutText(Image1,"The Text,in OpenCV,just only wrote in English--",TextPosition1,&Font1,Color);

    FontFace=CV_FONT_HERSHEY_SIMPLEX;
    HorizontalScale=1;
    VerticalScale=1;
    Shear=0.1;
    Thickness=1;
    LineType=CV_AA;
    TextPosition2=cvPoint(200,350);
    TextPosition3=cvPoint(200,400);

    cvInitFont(&Font1,FontFace,HorizontalScale,VerticalScale,Shear,Thickness,LineType);

    cvPutText(Image1,"It did'nt write in Chinese,",TextPosition2,&Font1,Color);
    cvPutText(Image1,"because it did'nt support UTF-8.",TextPosition3,&Font1,Color);

    cvGetTextSize("because it did'nt support UTF-8.",&Font1,&TextSize,&Baseline);
    printf("width=%d\nheight=%d\nBaseline=%d\n",TextSize.width,TextSize.height,Baseline);

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

執行結果:


上面的文字訊息,表達的是OpenCV只支援ASCII code的文字資訊輸入,一開始先給一個IplImage資料結構,給他一個通道3的8bits空間,再用cvFont()對它初始化,Scale表示字型長寬比例設定,1是原始大小,Thickness是線條的粗細,1亦是原始粗細,而字體類型則被OpenCV的cvFont()預設了,接著在cvPutText()放置目標圖形,文字內容,文字座標,文字顏色,文字的顏色則是用Channel為3的RGB三原色所組成的,因此,使用了CV_RGB()的函式,所有顏色的種類都可以被R+G+B的數字組合.再來的是用cvInitFont()將CvFont資料結構重新初始化,在做CvFont的時候,要用cvFont()或是cvInitFont()來做初始化哪個都行,但cvInitFont()可輸入的文字資訊則較多,cvInitFont()則可輸入字體(FontFace),水平比例(HorizontalScale),垂直比例(VerticalScale),頃斜程度(Shear),字體粗細(Thickness),線條種類(LineType).再用cvPutText()輸出文字內容.最後的cvGetTextSize()則是取得文字方框資訊,像是前面的Drawing的OpenCVForever()一樣,方便座標的排版可以取得文字方框的高度及寬度,以及每提升2.4高度就提升1個Baseline.

cvFont()
初始化CvFont資料結構,給他一個Scale代表字型比例Scale代表HorizontalScale跟VerticalScale的數值,而它的字體被預設為CV_FONT_HERSHEY_PLAIN,而它的另一個參數是字體粗細
cvFont(字型大小比例,字體粗細)

cvInitFont()
亦是做CvFont初始化動作,給他一個CvFont資料結構,字型種類,它的字型種類(Font face)被OpenCV定義為

#define CV_FONT_HERSHEY_SIMPLEX 0
#define CV_FONT_HERSHEY_PLAIN 1
#define CV_FONT_HERSHEY_DUPLEX 2
#define CV_FONT_HERSHEY_COMPLEX 3
#define CV_FONT_HERSHEY_TRIPLEX 4
#define CV_FONT_HERSHEY_COMPLEX_SMALL 5
#define CV_FONT_HERSHEY_SCRIPT_SIMPLEX 6
#define CV_FONT_HERSHEY_SCRIPT_COMPLEX 7

而他接著的輸入是水平比例,鉛直比例,頃斜程度,字體粗細,線條種類,它的線條種類被定義為4,8,16,其中16的參數為

#define CV_AA 16

但4跟8卻沒被定義,4表示4鄰接,8表示8鄰接,用的演算法為Bresenham的線條演算法.
cvInitFont(CvFont資料結構,字型種類參數或代號,水平比例數據,鉛直比例數據,頃斜程度數據,字體粗細數據,線條種類參數或代號)

cvPutText()
為文字輸入的地方,給他IplImage資料結構,文字,文字座標,CvFont資料結構,文字顏色.
cvPutText(IplImage資料結構,"文字字串",CvPoint資料結構文字座標,CvFont資料結構,CvScalar資料結構文字顏色)

cvGetTextSize()
輸入一段文字及給它CvFont資料結構,他可以幫忙預估文字方框的長寬及Baseline,而必須要先給它空的CvSize資料結構的記憶體位址及空的int記憶體位址.
cvGetTextSize("文字字串",CvFont資料結構,空的CvSize資料結構,空的int型別變數);



2 意見:

匿名 提到...

我用2.0出現錯誤
error C2065: 未宣告的識別項
error C2228: '.width' 的左邊必須有類別/結構/等位
1> 型別為 ''unknown-type''

...等等的

匿名 提到...

多加入兩行宣告
CvSize TextSize;
int Baseline;
即可。

Copyright 2008-2009,yester