我需要一种无需实际修改基础图像即可在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;
}
您可以在黑色图像上输出文本,然后对源图像进行XOR,以放置文本,第二个XOR将从源图像中清除文本。
如果您使用的是OpenCV 3+,并已使用Qt构建了OpenCV,则可以在Qt GUI窗口上使用highgui函数来覆盖文本,而不用主动修改图像。参见displayOverlay()
。您也可以简单地更改状态栏文本,有时使用displayOverlay()
会更有用(这样您就不会覆盖或出现颜色冲突)。