C++ OpenCV从大小中查找文本比例

C++ OpenCV从大小中查找文本比例,c++,opencv,C++,Opencv,您好,我想找到的是一种为ROI获得正确文本比例的方法。比例值也应根据插入文本的大小进行控制 简单地说,我试图找到的是函数“getTextScale”或类似的东西: std::String text = "Huhu"; int fontface = cv::FONT_HERSHEY_PLAIN; int thickness = 2; int baseline = 0; cv::Size sz(500,200); double fontScale = cv::getTextScale(text, f

您好,我想找到的是一种为ROI获得正确文本比例的方法。比例值也应根据插入文本的大小进行控制

简单地说,我试图找到的是函数“getTextScale”或类似的东西:

std::String text = "Huhu";
int fontface = cv::FONT_HERSHEY_PLAIN;
int thickness = 2;
int baseline = 0;
cv::Size sz(500,200);
double fontScale = cv::getTextScale(text, fontFace, thickness, &baseline,sz);
在此计算之后,cv::getTextSize(文本、fontFace、fontScale、厚度和基线);将检索与sz相似的值。opencv有这个功能吗

--编辑--

我发现opencv中的cv::getTextSize如下所示:

Size getTextSize( const string& text, int fontFace, double fontScale, int thickness, int* _base_line)
{
    Size size;
    double view_x = 0;
    const char **faces = cv::g_HersheyGlyphs;
    const int* ascii = getFontData(fontFace);

    int base_line = (ascii[0] & 15);
    int cap_line = (ascii[0] >> 4) & 15;
    size.height = cvRound((cap_line + base_line)*fontScale + (thickness+1)/2);

    for( int i = 0; text[i] != '\0'; i++ )
    {
        int c = (uchar)text[i];
        Point p;

        if( c >= 127 || c < ' ' )
            c = '?';

        const char* ptr = faces[ascii[(c-' ')+1]];
        p.x = (uchar)ptr[0] - 'R';
        p.y = (uchar)ptr[1] - 'R';
        view_x += (p.y - p.x)*fontScale;
    }

    size.width = cvRound(view_x + thickness);
    if( _base_line )
        *_base_line = cvRound(base_line*fontScale + thickness*0.5);
    return size;
}
Size getTextSize(常量字符串和文本、int-fontFace、双fontScale、int-thickness、int*\u基线)
{
大小;
双视图_x=0;
常量字符**面=cv::g_HersheyGlyphs;
常量int*ascii=getFontData(fontFace);
int base_line=(ascii[0]&15);
int cap_line=(ascii[0]>>4)和15;
尺寸高度=cvRound((帽线+基准线)*fontScale+(厚度+1)/2);
对于(int i=0;text[i]!='\0';i++)
{
int c=(uchar)文本[i];
p点;
如果(c>=127 | | c<'')
c='?';
const char*ptr=面[ascii[(c-“”)+1];
p、 x=(uchar)ptr[0]-'R';
p、 y=(uchar)ptr[1]-'R';
视图x+=(p.y-p.x)*缩放比例;
}
尺寸.宽度=cvRound(视图×厚度);
如果(基线)
*_基线=cvRound(基线*fontScale+厚度*0.5);
返回大小;
}
现在看起来我很神奇,但也许有人比我更了解这段代码

--编辑2--

现在我已经编写了函数getTextScalefromheight,它满足了我的要求:

double getTextScalefromheight(int fontFace, int thickness, int height)
{

    Size size;
    double view_x = 0;
    const char **faces = g_HersheyGlyphs;
    const int* ascii = getFontData(fontFace);

    int base_line = (ascii[0] & 15);
    int cap_line = (ascii[0] >> 4) & 15;

    double fontScale = static_cast<double>(height - static_cast<double>((thickness + 1)) / 2.0) / static_cast<double>(cap_line + base_line);

    return fontScale;

}
double getTextScalefromheight(int-fontFace、int-thickness、int-height)
{
大小;
双视图_x=0;
常量字符**面=g_HersheyGlyphs;
常量int*ascii=getFontData(fontFace);
int base_line=(ascii[0]&15);
int cap_line=(ascii[0]>>4)和15;
双fontScale=静态投影(高度-静态投影((厚度+1))/2.0)/静态投影(帽线+基线);
回归尺度;
}

由于opencv中的文本比例无法更改,我认为这个解决方案行吗(我必须从drawing.cpp文件的opencv源中重新定义g_HersheyGlyphs和getFontData)。

我的解决方案是使用以下功能:

double getTextScalefromheight(int fontFace, int thickness, int height)
{

    Size size;
    double view_x = 0;
    const char **faces = g_HersheyGlyphs;
    const int* ascii = getFontData(fontFace);

    int base_line = (ascii[0] & 15);
    int cap_line = (ascii[0] >> 4) & 15;

    double fontScale = static_cast<double>(height - static_cast<double>((thickness + 1)) / 2.0) / static_cast<double>(cap_line + base_line);

    return fontScale;

}
double getTextScalefromheight(int-fontFace、int-thickness、int-height)
{
大小;
双视图_x=0;
常量字符**面=g_HersheyGlyphs;
常量int*ascii=getFontData(fontFace);
int base_line=(ascii[0]&15);
int cap_line=(ascii[0]>>4)和15;
双fontScale=静态投影(高度-静态投影((厚度+1))/2.0)/静态投影(帽线+基线);
回归尺度;
}

您是否尝试将文本调整为特定大小?i、 e 500x200?如果是,您可以简单地对两个比例进行采样,并以像素为单位计算其缩放距离。现在,您可以为给定的图像大小计算所需的缩放比例!所以你的输入是一个ROI和一种字体,你想找到最大的比例来将文本放在该ROI的一行中?我有不同分辨率的不同框,我不想自动获得比例值。回答你自己的问题没问题。所以,如果这对你有用的话,也许你应该发布你的编辑2作为答案。