Opencv 在图像中插入文字

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 
#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");
}

你可能感兴趣的:(Open-cv学习)