opencv两个不错的封装函数(创建按钮和显示文本)

来源:互联网 发布:哥伦比亚的倒影知乎 编辑:程序博客网 时间:2024/06/04 23:35

opencv两个不错的封装函数(创建按钮和显示文本)


在图像上显示文本(draw text)和创建按钮(draw button)

1、drawString()函数封装了opencv的putText函数和getTextSize函数,使得画显示文本更加安全,可靠。

函数接口:

Rect drawString(Mat img, string text, Point coord, Scalar color, float fontScale = 0.6f, int thickness = 1, int fontFace = FONT_HERSHEY_COMPLEX)
1、img,画布

2、text,要显示的文本信息

3、coord要显示文本的坐标位置。例如Point(20,20),x,y均为正数,则从偏离左上角高20宽20像素开始画文本

                                                                    Point(20,-10),x为正数,y为负数,则从偏离左20,底10,开始画文本。对于Point(-20,10),Point(-20,-20)类似。

4、fontScale,字体的缩放大小,当文本信息过多一行不能显示,则可以缩小字体

5、thickness,为字体粗细

6、fontFace,字体类型

Rect drawString(Mat img, string text, Point coord, Scalar color, float fontScale = 0.6f, int thickness = 1, int fontFace = FONT_HERSHEY_COMPLEX){//获取文本大小和基线 int baseline=0;Size textSize = getTextSize(text, fontFace, fontScale, thickness, &baseline);baseline += thickness;// 为左/右或上/下调整校正坐标if (coord.y >= 0) {//图像左上角的文本的左上角的坐标,因此按行向下移动coord.y += textSize.height;}else {//图像左下角的文本的左下角的坐标,因此从底部上来coord.y += img.rows - baseline + 1;}// 如果希望变成右侧调整if (coord.x < 0) {coord.x += img.cols - textSize.width + 1;}// 获取文本的边界矩形Rect boundingRect = Rect(coord.x, coord.y - textSize.height, textSize.width, baseline + textSize.height);// 画出平滑的文本putText(img, text, coord, fontFace, fontScale, color, thickness, CV_AA);//让用户知道文本的多大,以防他们想安排些事情return boundingRect;}


2、drawButton()函数封装了drawString函数,在矩形区域内加了背景颜色和边界框颜色,类似与按钮,后续博客内容将为按钮添加响应事件。

Rect drawButton(Mat img, string text, Point coord, int minWidth = 0){int B = 10;Point textCoord = Point(coord.x + B, coord.y + B);// 获取文本边界矩形Rect rcText = drawString(img, text, textCoord, CV_RGB(0,0,0));// 在文本周围画一个填充的矩形Rect rcButton = Rect(rcText.x - B, rcText.y - B, rcText.width + 2*B, rcText.height + 2*B);// 设置按钮的最小宽度if (rcButton.width < minWidth)rcButton.width = minWidth;// 创建一个半透膜的白色矩形Mat matButton = img(rcButton);matButton += CV_RGB(90, 90, 90);//画一个非透明的白色边界 rectangle(img, rcButton, CV_RGB(200,200,200), 1, CV_AA);//使用抗锯齿,画一个实际用来显示的文本drawString(img, text, textCoord, CV_RGB(10,55,20));return rcButton;}

main函数调用如下:

int main(int argc,char **argv){Mat img=imread(argv[1],1);const int b=10;string str="The most striking difference between a cat and a lie is that a cat has only 9 lives";string b_name1="cancel";string b_name2="add";string b_name3="paste";Rect b_seat1;Rect b_seat2;Rect b_seat3;drawString(img,str,Point(10,-20),Scalar(0,255,0),0.33f,1,3);//在底上20处,右10处,画文本b_seat1=drawButton(img,b_name1,Point(b,b),0);b_seat2=drawButton(img,b_name2,Point(b_seat1.x,b_seat1.height+b),b_seat1.width);b_seat3=drawButton(img,b_name3,Point(b_seat2.x,b_seat2.height+b_seat2.y),b_seat1.width);imshow("lena.jpg",img);waitKey();}

运行效果:


原文链接:http://www.csdn123.com/html/mycsdn20140110/84/8403a669ceed8e896d5c3ebc45b483b4.html 

0 0
原创粉丝点击