opencv c++鼠标拖动任意画多个圆并同时显示多个圆
时间: 2023-06-13 17:07:27 浏览: 97
基于C++OpenCV实现的直线检测、圆检测.zip
5星 · 资源好评率100%
要实现这个功能,你需要使用OpenCV的鼠标事件回调函数,并在回调函数中实现画圆的逻辑。以下是一个简单的示例代码,可以让用户通过鼠标拖动来画任意数量的圆,同时在屏幕上显示这些圆:
```c++
#include <opencv2/opencv.hpp>
#include <vector>
using namespace cv;
// 存储所有圆的数组
std::vector<Point2f> circles;
// 鼠标事件回调函数
void onMouse(int event, int x, int y, int flags, void* userdata)
{
if (event == EVENT_LBUTTONDOWN) {
// 当用户按下鼠标左键时,记录下当前坐标作为圆心
circles.push_back(Point2f(x, y));
} else if (event == EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON)) {
// 当用户拖动鼠标时,根据当前坐标和上一个坐标的距离计算出半径
int last = circles.size() - 1;
float dx = x - circles[last].x;
float dy = y - circles[last].y;
float radius = std::sqrt(dx * dx + dy * dy);
// 更新半径
circles[last].size = radius;
}
}
int main()
{
Mat image(500, 500, CV_8UC3, Scalar(255, 255, 255));
namedWindow("Circle Drawing", WINDOW_AUTOSIZE);
setMouseCallback("Circle Drawing", onMouse, NULL);
while (true) {
Mat display = image.clone();
// 在屏幕上画出所有的圆
for (const auto& circle : circles) {
circle(display, circle, circle.size, Scalar(0, 0, 255), 2);
}
imshow("Circle Drawing", display);
char key = waitKey(30);
if (key == 27) {
break;
}
}
return 0;
}
```
在这个示例代码中,我们创建了一个空白的500x500像素的图像,然后创建了一个窗口并设置了鼠标回调函数。当用户按下鼠标左键时,我们记录下当前坐标作为圆心,当用户拖动鼠标时,我们根据当前坐标和上一个坐标的距离计算出半径,并更新最后一个圆的半径。在主循环中,我们在屏幕上画出所有的圆,并等待用户按下ESC键退出程序。
阅读全文