0

我需要一种在 opencv 图像上覆盖文本而不实际修改底层图像的方法。例如,在一个 while 循环中,我为每次迭代创建一个随机点,我想显示它。如果我使用 puttext,矩阵会在每个循环中被添加的文本覆盖。

我的问题是如何在不修改底层矩阵的情况下在 opencv 图像上覆盖文本。我知道我可以使用原始图像的临时副本并每次上传。但是我想避免它。

我的尝试(失败)如下:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;

int main(int argc, char * argv[])
{

    RNG rng( 0xFFFFFFFF );
    cv::Mat image(480, 640, CV_8UC3, cv::Scalar(0,255,0));

    int fontFace = FONT_HERSHEY_COMPLEX_SMALL;
    double fontScale_small=1.5;
    double fontScale_large=10.;
    std::string text="X";

    Point p;

    while(1)
    {

        p.x = rng.uniform( 0, 639 );
        p.y = rng.uniform( 0, 479 );

        putText(image, "X", p, fontFace, 1, Scalar(0,0,255), 2);

        imshow("IMAGE", image);
    waitKey(1);
    }

    return 0;
}
4

2 回答 2

4

如果您使用的是 OpenCV 3+ 并且已经使用 Qt 构建了 OpenCV,那么您可以使用 Qt GUI 窗口中的 highgui 功能来覆盖文本,而不是主动修改您的图像。见displayOverlay()。您还可以简单地更改状态栏文本,这有时更有用(这样您就不会覆盖图像或必须处理颜色冲突)displayStatusBar()。但是,请注意,displayOverlay()这不允许您为文本指定特定位置。

如果没有 QT 支持,我认为这在 OpenCV 中是不可能的。您需要通过putText()或修改您的图像addText(),或者滚动您自己的 GUI 窗口,您可以在上面覆盖文本。

于 2019-10-06T08:09:34.877 回答
0

您可以在黑色图像上输出文本,然后与源图像进行 XOR 以放置您的文本,第二个 XOR 将从源图像中清除您的文本。

于 2019-10-06T07:59:30.850 回答