我要想在一个图片中插入文字,查找资料学习总结下,与大家分享,首先要初始化字体结构,然后用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使用给定的字体和颜色在图像上显示文本字符串。这些显示的文本由感兴趣矩形包围着。不属于指定字体的符号将被这些矩形符号替代。
原型:
void cvPutText( CvArr* img, const char* text, CvPoint org, const CvFont* font,CvScalar color );
img:
输入图像
text:
要显示的字符串
org:
第一个字母左下角的坐标
font:
指向字体结构的指针
color:
文本的颜色.
/*示例代码:*/
//此代码是我学习Opencv直方图的代码
#include
#include
#include
#include
#include
#include
#include
#include
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 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");
}