使用opencv显示图像和文本

使用opencv显示图像和文本,opencv,Opencv,使用opencv,我们可以在图像上显示文本。标准方法是 cv2.putText(img, "my_text", (x, y), font, 1.0, (255, 255, 255), 0) 但我想显示一个小图标图像,后跟文本(在本例中为“我的文本”) 我可以通过以下方式将图像覆盖在图像上: icon_img = cv2.imread("icon.png") icon_img1= cv2.resize(icon_img, (20,20)) x_offset=y_offset=5 img[y_o

使用opencv,我们可以在图像上显示文本。标准方法是

cv2.putText(img, "my_text", (x, y), font, 1.0, (255, 255, 255), 0)
但我想显示一个小图标图像,后跟文本(在本例中为“我的文本”)

我可以通过以下方式将图像覆盖在图像上:

icon_img = cv2.imread("icon.png")
icon_img1= cv2.resize(icon_img, (20,20))

x_offset=y_offset=5
img[y_offset:y_offset+icon_img1.shape[0], x_offset:x_offset+icon_img1.shape[1]] = icon_img1
但是我希望图标随着显示文本一起移动

图标可能是这样的


谢谢大家!

这在opencv中是不可能的

Opencv在其基本GUI中没有z层的概念,因此您将负责设置图像中每个元素的位置。Opencv的GUI并不是真正为成熟应用程序开发的界面,而是更多用于测试和开发目的。如果你真的想要一个成熟的GUI,我推荐Qt或wxPython

然而,对于这个非常基本的问题,你能做的是

icon_img = cv2.imread("icon.png")
icon_img1= cv2.resize(icon_img, (20,20))
x_offset=y_offset=5
img[y_offset:y_offset+icon_img1.shape[0], x_offset:x_offset+icon_img1.shape[1]] = icon_img1

cv2.putText(img, "my_text", (x_offset+icon_img1.shape[1], y_offset+icon_img1.shape[0]), font, 1.0, (255, 255, 255), 0)

这会将要放置在图像后面的文本移动到图像右下角

这在opencv中是不可能的

Opencv在其基本GUI中没有z层的概念,因此您将负责设置图像中每个元素的位置。Opencv的GUI并不是真正为成熟应用程序开发的界面,而是更多用于测试和开发目的。如果你真的想要一个成熟的GUI,我推荐Qt或wxPython

然而,对于这个非常基本的问题,你能做的是

icon_img = cv2.imread("icon.png")
icon_img1= cv2.resize(icon_img, (20,20))
x_offset=y_offset=5
img[y_offset:y_offset+icon_img1.shape[0], x_offset:x_offset+icon_img1.shape[1]] = icon_img1

cv2.putText(img, "my_text", (x_offset+icon_img1.shape[1], y_offset+icon_img1.shape[0]), font, 1.0, (255, 255, 255), 0)

这会将要放置在图像后面的文本移动到图像右下角

我不确定我是否理解您在做什么,但我想您希望在视频帧周围的不同位置放置一个带有相关文本的图标,是吗?我假设你希望文本相对于图标保持在同一个位置,是吗

如果是这样的话,我会创建一个小的“画布”(即
Mat
),刚好够放图标和文本,并将它们都放在上面

然后,当每一帧视频到达时,在视频帧中创建一个ROI,并使用
copyTo()
将那小块画布复制到视频帧的顶部:

// define image ROI at bottom-right of video frame
cv::Mat imageROI(frame, cv::Rect(frame.cols-canvas.cols,
                                 frame.rows-canvas.rows,
                                 canvas.cols,canvas.rows));

// insert icon canvas
canvas.copyTo(imageROI);

我不确定我是否理解您在做什么,但我想您希望在视频帧周围的不同位置放置一个带有相关文本的图标,是吗?我假设你希望文本相对于图标保持在同一个位置,是吗

如果是这样的话,我会创建一个小的“画布”(即
Mat
),刚好够放图标和文本,并将它们都放在上面

然后,当每一帧视频到达时,在视频帧中创建一个ROI,并使用
copyTo()
将那小块画布复制到视频帧的顶部:

// define image ROI at bottom-right of video frame
cv::Mat imageROI(frame, cv::Rect(frame.cols-canvas.cols,
                                 frame.rows-canvas.rows,
                                 canvas.cols,canvas.rows));

// insert icon canvas
canvas.copyTo(imageROI);

为此,必须手动为图像和文本指定像素坐标。你需要帮忙吗?@ShawnMathew:谢谢Shawn的建议。我已经更新了这个问题。如果你展示这个过程,这将是非常有帮助的。你说的“你想让图标移动”是什么意思?你是否将图标和文本放置在图像周围的许多不同位置或其他位置?@MarkSetchell:Hi Mark,我想在视频帧中显示文本。因此,在视频中,图像将在帧上移动。所以我希望图标能够动态移动。要做到这一点,您必须手动为图像和文本指定像素坐标。你需要帮忙吗?@ShawnMathew:谢谢Shawn的建议。我已经更新了这个问题。如果你展示这个过程,这将是非常有帮助的。你说的“你想让图标移动”是什么意思?你是否将图标和文本放置在图像周围的许多不同位置或其他位置?@MarkSetchell:Hi Mark,我想在视频帧中显示文本。因此,在视频中,图像将在帧上移动。所以我希望图标能够动态移动。谢谢Shawn!我会考虑一下你的建议,谢谢肖恩!我会考虑你的建议,谢谢你的回答!假设视频中有多个蔬菜项目。有些是新鲜蔬菜,有些不是。因此,对于新鲜蔬菜,它将显示带有“快乐微笑”的蔬菜名称。而对于不那么新鲜的,用蔬菜名字命名的“悲伤的微笑”。现在,蔬菜的图像将出现在帧中的不同位置。所以我希望图标是动态的。我试试你的解决办法。不确定是否可以将其转换为python代码。我不熟悉C++。再次感谢!谢谢马克的回答!假设视频中有多个蔬菜项目。有些是新鲜蔬菜,有些不是。因此,对于新鲜蔬菜,它将显示带有“快乐微笑”的蔬菜名称。而对于不那么新鲜的,用蔬菜名字命名的“悲伤的微笑”。现在,蔬菜的图像将出现在帧中的不同位置。所以我希望图标是动态的。我试试你的解决办法。不确定是否可以将其转换为python代码。我不熟悉C++。再次感谢!