opencv c++鼠标拖动任意画多个圆并同时显示多个圆
时间: 2023-06-14 09:05:00 浏览: 59
基于C++OpenCV实现的直线检测、圆检测.zip
5星 · 资源好评率100%
下面是一个简单的示例代码,可以在OpenCV中实现拖动鼠标并画出多个圆形的功能:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
bool drawing = false; // 是否正在画图
Point start_point; // 鼠标起始点
Point end_point; // 鼠标结束点
std::vector<Point> centers; // 存储圆心坐标
std::vector<int> radiuses; // 存储半径
// 鼠标事件回调函数
void mouse_callback(int event, int x, int y, int flags, void* userdata)
{
if (event == EVENT_LBUTTONDOWN)
{
drawing = true;
start_point = Point(x, y);
}
else if (event == EVENT_MOUSEMOVE)
{
if (drawing)
{
end_point = Point(x, y);
}
}
else if (event == EVENT_LBUTTONUP)
{
drawing = false;
Point center = (start_point + end_point) / 2;
int radius = norm(end_point - start_point) / 2;
centers.push_back(center);
radiuses.push_back(radius);
}
}
int main()
{
Mat image(512, 512, CV_8UC3, Scalar(255, 255, 255));
namedWindow("image");
setMouseCallback("image", mouse_callback);
while (true)
{
Mat temp = image.clone();
if (drawing)
{
circle(temp, start_point, norm(end_point - start_point), Scalar(0, 0, 255), 2);
}
for (size_t i = 0; i < centers.size(); i++)
{
circle(temp, centers[i], radiuses[i], Scalar(0, 255, 0), 2);
}
imshow("image", temp);
char key = waitKey(10);
if (key == 27) // ESC键
{
break;
}
}
return 0;
}
```
在上面的代码中,我们定义了一个 `drawing` 变量来标记是否正在画图,`start_point` 和 `end_point` 变量来记录鼠标起始点和结束点。当鼠标左键按下时,`drawing` 被设置为 `true`,`start_point` 被设置为当前鼠标坐标。当鼠标移动时,如果 `drawing` 为 `true`,则 `end_point` 被设置为当前鼠标坐标。当鼠标左键释放时,`drawing` 被设置为 `false`,我们计算出圆心坐标和半径,并将它们存储在 `centers` 和 `radiuses` 向量中。
在主循环中,我们首先复制原始图像到 `temp` 变量中,并在其中绘制正在绘制的圆形。然后,我们遍历 `centers` 和 `radiuses` 向量,并在 `temp` 中绘制所有圆形。最后,我们将 `temp` 显示在窗口中,并等待用户按下 ESC 键退出程序。
希望这个示例代码能够帮助到你。
阅读全文