您的位置:首页 > 运维架构

Opencv 在图像中插入文字

2015-07-03 10:50 309 查看

Opencv 在图像中插入文字

我要想在一个图片中插入文字,查找资料学习总结下,与大家分享,首先要初始化字体结构,然后用cvPutText()函数使用给定的字体和颜色在图像上显示文本字符串。 下面是初始化字体结构函数cvInitFont和cvPutText函数的原型及其各参数详解,代码为本人做的Opencv直方图练习代码,其中的插入字符串,仅支持英文字体。

如下代码段仅仅是在vc中隐藏DOS窗口的方法,强制制定入口点,必须添加在程序开头处。但若是用system()调用系统命令,就会有黑色窗口一闪而过。

#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")


初始化字体结构体。

原型:

void cvInitFont( CvFont* font, int font_face, double hscale,

double vscale, double shear=0,

int thickness=1, int line_type=8 );

font

被初始化的字体结构体。

font_face

字体名称标识符。只是Hershey 字体集( http://sources.isc.org/utils/misc/hershey-font.txt )的一个子集得到支持。

CV_FONT_HERSHEY_SIMPLEX - 正常大小无衬线字体。

CV_FONT_HERSHEY_PLAIN - 小号无衬线字体。

CV_FONT_HERSHEY_DUPLEX - 正常大小无衬线字体。( 比CV_FONT_HERSHEY_SIMPLEX更复杂)

CV_FONT_HERSHEY_COMPLEX - 正常大小有衬线字体。

CV_FONT_HERSHEY_TRIPLEX - 正常大小有衬线字体 ( 比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更复杂。

这个参数能够由一个值和可选择的CV_FONT_ITALIC字体标记合成,就是斜体字。

hscale

字体宽度。如果等于1.0f,字符的宽度是最初的字体宽度。如果等于0.5f,字符的宽度是最初的字体宽度的一半。

vscale

字体高度。如果等于1.0f,字符的高度是最初的字体高度。如果等于0.5f,字符的高度是最初的字体高度的一半。

shear

字体的斜度。当值为0时 ,字符不倾斜;当值为1.0f时,字体倾斜≈45度,等等。厚度让字母着重显示。函数cvLine用于绘制字母。

thickness

字体笔划的粗细程度。

line_type

字体笔划的类型,参见cvLine。

函数cvInitFont初始化字体结构体,字体结构体可以被传递到文字显示函数中。

cvPutText()

函数cvPutText使用给定的字体和颜色在图像上显示文本字符串。这些显示的文本由感兴趣矩形包围着。不属于指定字体的符号将被这些矩形符号替代。

原型:

void cvPutText( CvArr* img, const char* text, CvPoint org, const CvFont* font,CvScalar color );

  

  img:

  输入图像

  text:

  要显示的字符串

  org:

  第一个字母左下角的坐标

  font:

  指向字体结构的指针

  color:

  文本的颜色.

示例代码:

/*示例代码:*/
//此代码是我学习Opencv直方图的代码
#include <cv.h>
#include <cvaux.h>
#include <opencv2\highgui\highgui_c.h>
#include <opencv2\core\core_c.h>
#include <iostream>
#include <opencv2\opencv.hpp>
#include <cstring>
#include <cstdio>

using namespace std;
using namespace cv;
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")

int main()
{
IplImage *img = cvLoadImage("C:\\Fruits.jpg");
//cvvNamedWindow("原图");
//cvvShowImage("原图",img);

int hist_size =255;                     //直方图的帧数
float range_0[] = {0,256};              //第0维数值变化范围
float * ranges[] = {range_0};           //第1维数值的变化范围
int i,bin_w;                            //下标号
float max_value =  0,min_value = 0;     //直方图数值的max和Min
int min_idx =0, max_idx =0;             //对应上述max和min数值时的下标号
double mean =0,variance = 0;            //用于存放平均值(mean)和变化量(variance)的变量
IplImage *pImage = NULL;
IplImage *pImgGray =NULL;

//将已经读入系统的图像复制一份
pImage = cvCloneImage(img);
pImgGray = cvCreateImage(cvSize(pImage->width,pImage->height),IPL_DEPTH_8U,1);
cvCvtColor(pImage,pImgGray,CV_BGR2GRAY);
CvRect rect = cvRect(0,0,600,700);
cvSetImageROI(pImgGray,rect);
IplImage *histImage = cvCreateImage(cvSize(320,200),8,1);
//创建一个指定尺寸的直方图,用于存放从图像获得的信息
CvHistogram *hist =cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);
//计算直方图并作用到hist变量
cvCalcHist(&pImgGray,hist,0,NULL);
//得到直方图中最大最小值及其标号
cvGetMinMaxHistValue(hist,&min_value,&max_value,&min_idx,&max_idx);
//缩放这些最大最小值以容入图像内
cvScale(hist->bins,hist->bins,((double)histImage->height)/max_value,0);
//设置所有直方图的数值为255
cvSet(histImage,cvScalarAll(255),0);
//建立一个比例因子以沿宽度缩放
bin_w = cvRound((double)histImage->width/hist_size);
for(i=0;i < hist_size; i++)
{
//把直方图画到图像中
cvRectangle(histImage,cvPoint(i*bin_w,histImage->height),cvPoint((i+1)*bin_w,
histImage->height-cvRound(cvGetReal1D(hist->bins,i))),
cvScalarAll(0),-1,8,0);
//得到当前数值
float *bins = cvGetHistValue_1D(hist,i);
//增加均值
mean += bins[0];
}
//均值计算完毕
mean /= hist_size;
//有了均值后就可以计算变化量了
for(i=0;i <hist_size;i++)
{
float * bins = cvGetHistValue_1D(hist,i);
variance += pow((bins[0]-mean),2);
}
//变化量计算完毕
variance /= hist_size;
//创建窗口,显示图像
cvNamedWindow("Original",0);
cvShowImage("Original",pImage);
cvNamedWindow("Gray",0);
cvShowImage("Gray",pImgGray);

CvFont * pfont = new CvFont;//CV_FONT_HERSHEY_SIMPLEX
cvInitFont(pfont,CV_FONT_HERSHEY_SIMPLEX,0.5F,0.5F,1,2);
string Result = "Histogram Mean:";
char buffer[30];
sprintf_s(buffer,"%f",mean);
string str=buffer;
Result += str + "\n";
cvPutText(histImage,Result.c_str(),cvPoint(20,80),pfont,CV_RGB(0,100,100));

cvNamedWindow("Histogram",0);
cvShowImage("Histogram",histImage);
cvWaitKey(0);
delete pfont;
cvReleaseImage(&histImage);
cvReleaseImage(&pImgGray);
cvDestroyWindow("Original");
cvDestroyWindow("Gray");
cvDestroyWindow("Histogram");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: