如何从显示 window 中删除 cv::circle
How to erase cv::circle from display window
我使用 OpenCV 库在图像上绘制圆圈。
我需要通过单击右键删除在 window 上绘制的最后一个圆圈。
目前,我写了解决方法,我用白色替换红色圆圈。
但似乎还有另一种解决方案,例如擦除它。
如何更新我的 UI?
std::vector<Point2f> right_image; // stores 4 points that the user clicks(mouse left click) in the main image.
if (e == EVENT_RBUTTONDOWN && right_image.size() > 0) {
float x0 = right_image[right_image.size()-1].x;
float y0 = right_image[right_image.size()-1].y;
cv::circle(dispImg, cv::Point(x0, y0), 10, cv::Scalar(255, 255, 255), 3);
cv::imshow(cv::String(fullWindowName), dispImg);
right_image.pop_back();
}
在没有任何覆盖的情况下存储图像会更快,并且每帧重绘圆圈。如果您想追加、移动或删除圆圈,只需将其从要绘制的对象列表中删除即可。
如果您正在开发光栅绘图程序,您可以实现简单的撤消。您将不得不使用屏幕外图像 (dispImg
) 和较小的 'undo' 图像。在离屏图像上绘制圆圈之前,将图像中将被新圆圈占据的部分保存为一个新的更小的图像。您还必须保存图像的位置。然后当你想擦除圆圈时,将保存的图像复制回屏幕外图像到与撤消图像一起保存的位置。最后将离屏图像绘制到window(imshow
).
假设您有足够的内存,您可以将此扩展到多级撤消。
如果您的程序是矢量绘图程序,像 Andrey 建议的那样的显示列表是更好的选择。
我使用 OpenCV 库在图像上绘制圆圈。 我需要通过单击右键删除在 window 上绘制的最后一个圆圈。 目前,我写了解决方法,我用白色替换红色圆圈。 但似乎还有另一种解决方案,例如擦除它。 如何更新我的 UI?
std::vector<Point2f> right_image; // stores 4 points that the user clicks(mouse left click) in the main image.
if (e == EVENT_RBUTTONDOWN && right_image.size() > 0) {
float x0 = right_image[right_image.size()-1].x;
float y0 = right_image[right_image.size()-1].y;
cv::circle(dispImg, cv::Point(x0, y0), 10, cv::Scalar(255, 255, 255), 3);
cv::imshow(cv::String(fullWindowName), dispImg);
right_image.pop_back();
}
在没有任何覆盖的情况下存储图像会更快,并且每帧重绘圆圈。如果您想追加、移动或删除圆圈,只需将其从要绘制的对象列表中删除即可。
如果您正在开发光栅绘图程序,您可以实现简单的撤消。您将不得不使用屏幕外图像 (dispImg
) 和较小的 'undo' 图像。在离屏图像上绘制圆圈之前,将图像中将被新圆圈占据的部分保存为一个新的更小的图像。您还必须保存图像的位置。然后当你想擦除圆圈时,将保存的图像复制回屏幕外图像到与撤消图像一起保存的位置。最后将离屏图像绘制到window(imshow
).
假设您有足够的内存,您可以将此扩展到多级撤消。
如果您的程序是矢量绘图程序,像 Andrey 建议的那样的显示列表是更好的选择。