OpenCV如何从一个尺寸中找到文本比例?

11

你好,我想找到一种方法来获取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(text, fontFace, fontScale, thickness, &baseline); 将会检索到类似于 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;
}

现在看起来对我来说像魔法,但也许有人比我更懂这段代码。

--编辑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;

}

我认为,由于在OpenCV中无法更改文本占比,因此我的这个解决方案是可行的(我必须重新定义g_HersheyGlyphs和getFontData,这些来自于文件drawing.cpp的OpenCV源代码)。


你是否正在尝试将文本适应特定的大小?例如500x200? - Balaji R
如果是的话,你可以简单地取样两个比例尺并计算它在像素方面的缩放程度。现在,你就可以根据给定的图像大小计算出所需的缩放比例了! - Balaji R
所以你的输入是一个ROI和一个字体,你想找到最大的比例来将文本放置在单行中以适应该ROI? - Micka
我有不同分辨率的不同盒子,我想自动获取比例值。 - jamk
回答自己的问题也是可以的。如果这对你有用的话,或许你应该把第二次编辑作为答案发表出来。 - DaBrain
1个回答

1
我的解决方案是使用以下函数:

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;

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接