OpenCV学习笔记(6)——绘图(包括字体和文字)


绘图是OpenCV经常使用的一个地方,很多时候我们需要绘制图像或者在已有的图像上方绘制一些图像。

1. 绘制直线

函数原型:
<div id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:5d952840-7141-4460-8d1a-0948c8e044de" class="wlWriterEditableSmartContent" style="float: none; margin: 0px; display: inline; padding: 0px;">
<pre class="brush: delphi;">void cvLine(
CvArr* array,
CvPoint pt1,
CvPoint pt2,
CvScalar color,
int thickness = 1,
int connectivity = 8
);</pre>
</div>
第一个参数 一般为一个图像类型的指针IplImage*。

第二个和第三个参数分别为直线的起点和终点,是CvPoint类型的,我们可以使用cvPoint(int x, int y)构造函数很方便的构造一个CvPoint类型的变量。

第四个参数是一个CvScalar类型的颜色变量,其结构前面已经介绍过,是一个包含四个双精度浮点型变量的集合。在这里。前三个分别代表红、绿、蓝通道(<span style="color: #ff0000;">但其实因为RGB在内存里面的存储顺序是BGRA BGRA,所以当使用CVScalar类型表示颜色时,其实四个分量分别代表B、G、R、A。如果想按照RGBA的顺序,可以使用后面介绍的宏CV_RGB构造CvScalar类型,而不是cvScalar。关于这一点,最后面的例子中也会有体现</span>);没有用到第四个(它只在适当的时候用于alpha通道)。一个常用的便捷宏指令是CV_RGB(r, g, b),该指令采用三个数字作为参数并将其封装到CvScalar。

最后两个参数是可选的,因为都有默认值。thickness是线的粗细(像素)。connectivity被设为反走样模式,默认值为“八连通”,这种是较为平滑不会走样的线型。也可以设置为“4连通”,这样的话,斜线会产生重叠以致看上去过于粗重,不过画起来速度很快。

2. 绘制矩形

函数原型:
<div id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:8c355eb3-2376-4975-aa00-734b9db87da4" class="wlWriterEditableSmartContent" style="float: none; margin: 0px; display: inline; padding: 0px;">
<pre class="brush: c;">void cvRectangle(
CvArr* array,
CvPoint pt1,
CvPoint pt2,
CvScalar color,
int thickness = 1
);</pre>
</div>
从函数原型就可以看出,这个函数和cvLine( )除了最后一个参数外,其他都一样。的确是,因为这个函数画的矩形总是平行于X和Y轴。利用这个函数画矩形,只需要给出两个对顶点就可以。

3. 绘制圆形和椭圆

函数原型:
<div id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:419e9572-f0dc-4690-9370-b0df3fc7670f" class="wlWriterEditableSmartContent" style="float: none; margin: 0px; display: inline; padding: 0px;">
<pre class="brush: c;">void cvCircle (
CvArr* array,
CvPoint center,
int radius,
CvScalar color,
int thickness = 1,
int connectivity = 8
);

void cvEllipse(
CvArr* img,
CvPoint center,
CvSize axes,
double angle,
double start_angle,
double end_angle,
CvScalar color,
int thickness =1,
int line_type = 8
);

// 使用外接矩形绘制椭圆
void cvEllipseBox(
CvArr* img,
CvBox2D box,
CvScalar color,
int thickness = 1,
int line_type = 8,
int shift = 0
);</pre>
</div>
画圆也很简单,参数和前面介绍的基本相同,这里就不多介绍了。对于圆形和矩阵等很多封闭图形来说,thickness参数也可以设置为CV_FILL,其值是-1,;其结果是使用与边一样的颜色填充封闭空间。

椭圆函数比cvCircle( )略复杂一点。主要的新成员是axes属性,其类型为CvSize,其结构前面已经介绍过,是一个包含宽度和高度的简单结构。同样,可以利用其构造函数cvSize( )得到一个CvSize结构。在这种情况下,height和width参数分别代表椭圆的长短半轴长。  angle是指偏离主轴的角度,从X轴算起,逆时针方向为正。同样,start_angle和end_angle表示弧线开始和结束位置的角度。因此,一个完整的椭圆必须分别将这两个值分别设为0°和360°。

除了cvEllipse( )函数外,还可以使用外接矩形的方法绘制椭圆,函数是cvEllipseBox( )。该函数用到一个CvBox2D结构:
<div id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:9ea67bcc-7078-4381-b06b-a5134f7cfd33" class="wlWriterEditableSmartContent" style="float: none; margin: 0px; display: inline; padding: 0px;">
<pre class="brush: c;">typedef struct {
CvPoint2D32f center,
CvSize2D32f size,
float angle
} CvBox2D;</pre>
</div>

4. 绘制多边形

绘制多边形有多个函数:
<div id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:312a9fc5-37ea-4f8b-aef2-8aa2deae8c3a" class="wlWriterEditableSmartContent" style="float: none; margin: 0px; display: inline; padding: 0px;">
<pre class="brush: c;">void cvFillPoly (
CvArr* img,
CvPoint** pts,
int* npts,
int contours,
CvScalar color
int line_type = 8
);

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

void cvPolyLine (
CvArr* img,
CvPoint** pts,
int* npts,
int contours,
int is_closed,
CvScalar color,
int thickness = 1,
int line_type = 8
);</pre>
</div>
这三个函数都可以绘制多边形,思路也基本相同,主要区别是如何描述点:

在cvFillPolly( )中,点是由CvPoint数组提供的。它允许cvFillPoly( )在一次调用中绘制多个多边形。同样的,npts是由计数点构成的数组,与多边形对应。如果把变量is_closed设为ture,那么下一个多边形的第一个线段就会从上一多边形最后一个点开始。cvFillPoly很稳定,可以处理自相交多边形,有孔的多边形等复杂问题。然而缺点是函数运行起来相对缓慢。

cvFillConvexPoly( )和cvFillPoly( )类似。不同的是,它一次只能画一个多边形,而且只能画凸多边形。优点是函数运行速度快。

第三个cvPolyLine( ),七参数与cvFillPoly( )基本相同,但因为只需画出多边形的边,不需处理相交情况。因此,函数运行速度远远超过cvFillPoly( )。

5. 绘制文字

OpenCV有一个主要的函数,叫cvPutText( ),这个函数可以在图像上输出一些文本。函数原型:
<div id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:e4be00e6-14da-43d2-bde5-7b9ca69a37ae" class="wlWriterEditableSmartContent" style="float: none; margin: 0px; display: inline; padding: 0px;">
<pre class="brush: c;">void cvPutText (
CvArr* img,
const text,
CvPoint origin,
const CvFont* font,
CvScalar color
);</pre>
</div>
参数text所指向的文本将打印到图像上。

参数origin指定文本框左下角位置。

参数color指定文本颜色。

要获取CvFont*指针需要调用函数cvInitFont( )函数。函数原型:
<div id="scid:f32c3428-b7e9-4f15-a8ea-c502c7ff2e88:ff19f507-549b-4cc3-96a1-839e39282dcb" class="wlWriterEditableSmartContent" style="float: none; margin: 0px; display: inline; padding: 0px;">
<pre class="brush: c;">void cvInitFont (
CvFont* font,
int font_face,
double hscale,
double vscale,
double shear = 0,
int thickness = 1,
int line_type = 8
);</pre>
</div>
该函数采用一组参数配置一些用于屏幕输出的基本特定字体。为了建立一个可以传值给cvPutText( )的cvFont,首先必须声明一个CvFont变量,然后把它传递给cvInitFont( )。

font_face是选择字体,且该标志可以和CV_FONT_ITALIC(字体标志)组合使用(使用与或)。以下是全部可用的字体:

标志名称 描述
CV_FONT_HERSHEY_SIMPLEX 正常尺寸的sanserif字体
CV_FONT_HERSHEY_PLAIN 小尺寸的sanserif字体
CV_FONT_HERSHEY_DUPLEX 正常尺寸的sanserif字体,但比CV_FONT_HERSHEY_SIMPLEX 复杂
CV_FONT_HERSHEY_COMPLEX 正常尺寸serif,比CV_FONT_HERSHEY_DUPLEX更复杂
CV_FONT_HERSHEY_TRIPLEX 正常尺寸serif,比CV_FONT_HERSHEY_COMPLEX更复杂
CV_FONT_HERSHEY_COMPLEX_SMALL 小尺寸的CV_FONT_HERSHEY_COMPLEX
CV_FONT_HERSHEY_SCRIPT_SIMPLEX 手写风格
CV_FONT_HERSHEY_SCRIPT_COMPLEX 比CV_FONT_HERSHEY_SCRIPT_SIMPLEX更复杂

hscale和vscale只能设定为1.0或0.5,。字体渲染时选择全高或半高(宽度同比缩放),绘制效果与指定字体的基本定义有关。

参数shear创建斜体字,如果设置为0.0,字体不倾斜。当设置为1.0时,字体倾斜范围接近45°。

其他两个参数与以前相同。

下面用一个例子来说明前面介绍的知识:

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <stdio.h>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    IplImage *image = cvCreateImage(cvSize(800, 600), 8, 3);

    // Draw Line
    cvLine(image, cvPoint(10, 10), cvPoint(500, 20),
            cvScalar(255), 2, 8, 1);

    // Draw Circle
    cvCircle(image, cvPoint(100, 100), 50, cvScalar(0, 255, 0), 2, 8, 0);

    // Draw Ellipse
    cvEllipse(image, cvPoint(400, 150),
        cvSize(100, 150), 45, 0, 360, cvScalar(0, 0, 255), 2);

    cvEllipse(image, cvPoint(600, 150),
        cvSize(100, 150), 0, 0, 360, CV_RGB(0, 0, 255), 2);

    // Draw Text
    CvFont  font1, font2, font3, font4, font5, font6, font7, font8;
    char* text = "Time Track";
    cvInitFont(&font1, CV_FONT_HERSHEY_COMPLEX, 1, 1, 0);
    cvPutText(image, text, cvPoint(100, 200), &font1, CV_RGB(0, 0, 0));

    cvInitFont(&font2, CV_FONT_HERSHEY_PLAIN, 1, 0.5, 0.2);
    cvPutText(image, text, cvPoint(100, 250), &font2, CV_RGB(0, 0, 0));

    cvInitFont(&font3, CV_FONT_HERSHEY_DUPLEX, 0.5, 1, 0.4);
    cvPutText(image, text, cvPoint(100, 300), &font3, CV_RGB(0, 0, 0));

    cvInitFont(&font4, CV_FONT_HERSHEY_COMPLEX, 0.5, 1, 0.6);
    cvPutText(image, text, cvPoint(100, 350), &font4, CV_RGB(0, 0, 0));

    cvInitFont(&font5, CV_FONT_HERSHEY_TRIPLEX | CV_FONT_ITALIC, 1, 1, 0.8);
    cvPutText(image, text, cvPoint(100, 400), &font5, CV_RGB(0, 0, 0));

    cvInitFont(&font6, CV_FONT_HERSHEY_COMPLEX_SMALL, 1, 1, 1);
    cvPutText(image, text, cvPoint(100, 450), &font6, CV_RGB(0, 0, 0));

    cvInitFont(&font7, CV_FONT_HERSHEY_SCRIPT_SIMPLEX, 1, 1, 2);
    cvPutText(image, text, cvPoint(100, 500), &font7, CV_RGB(0, 0, 0));

    cvInitFont(&font8, CV_FONT_HERSHEY_SCRIPT_COMPLEX, 1, 1, 3);
    cvPutText(image, text, cvPoint(200, 550), &font8, CV_RGB(0, 0, 0));

    cvNamedWindow("Display");
    cvShowImage("Display", image);

    cvWaitKey();
    return 0;
}

仅有一条评论

  1. Scottkib

    binar optionen betrug english to spanish translation

    http://siconpo.0fees.us/toquri/top-strategy-opzioni-binarie-forum-seating-charts.html
    binary option regulations governing licensure of child
    http://hosttiwin.freehostingking.com/mimaxywa/trader-option-binaire-forum.html
    come simulare opzioni binarie rischi sharma md
    http://flatolan.cuccfree.com/caruwin/interactive-option-complaints-probiotics-america.html
    http://igenles.260mb.net/pytugohyr/piattaforme-per-trading-di-opzioni-binarie-rischi.html
    commenti su opzioni binarie forum energy careers
    options trading hours cboe options hub network

    Scottkib 回复

添加新评论

选择表情 captcha

友情提醒:不填或错填验证码会引起页面刷新,导致已填的评论内容丢失。

|