opencv c++鼠标拖动任意画多个圆并同时显示多个圆
时间: 2023-09-04 11:05:02 浏览: 151
### 回答1:
以下是一个简单的示例代码,实现了鼠标拖动画多个圆并同时显示多个圆的功能。你可以根据自己的需求进行修改和优化。
```c++
#include <opencv2/opencv.hpp>
#include <vector>
using namespace cv;
using namespace std;
vector<Point> centers; //存储圆心坐标的向量
void onMouse(int event, int x, int y, int flags, void* param) {
if (event == EVENT_LBUTTONDOWN) { //鼠标左键按下
centers.push_back(Point(x, y)); //将圆心坐标添加到向量中
}
}
int main() {
Mat image(600, 800, CV_8UC3, Scalar(255, 255, 255)); //创建画布
namedWindow("Draw Circles"); //创建窗口
setMouseCallback("Draw Circles", onMouse); //设置鼠标回调函数
while (true) {
Mat img = image.clone(); //复制画布
for (size_t i = 0; i < centers.size(); i++) { //遍历向量中的所有圆心坐标
circle(img, centers[i], 20, Scalar(0, 0, 255), 2); //在画布上画圆
}
imshow("Draw Circles", img); //显示画布
char key = waitKey(10); //等待按键
if (key == 27) { //按下ESC键退出
break;
}
}
return 0;
}
```
运行代码后,你可以在窗口中用鼠标拖动画多个圆,并同时显示这些圆。按下ESC键即可退出程序。
### 回答2:
要实现在opencv c中鼠标拖动画多个圆并同时显示多个圆,可以按照以下步骤进行操作:
1. 导入所需的头文件:`#include <opencv2/opencv.hpp>`
2. 创建一个名为`drawing`的函数来处理鼠标事件:
```c++
void drawing(int event, int x, int y, int flags, void* param)
{
static cv::Point2i start_point;
static bool is_drawing = false;
if (event == CV_EVENT_LBUTTONDOWN) // 如果鼠标左键按下
{
start_point = cv::Point2i(x, y);
is_drawing = true; // 开始绘画
}
else if (event == CV_EVENT_LBUTTONUP) // 如果鼠标左键释放
{
is_drawing = false; // 结束绘画
}
else if (event == CV_EVENT_MOUSEMOVE && is_drawing) // 如果鼠标移动并且正在绘画
{
cv::Point2i end_point = cv::Point2i(x, y);
cv::Mat* image = (cv::Mat*)param;
cv::circle(*image, start_point, cv::norm(end_point - start_point), cv::Scalar(0, 255, 0), 2); // 绘制圆形
}
}
```
3. 在`main`函数中创建用于显示图像的窗口,并设置鼠标回调函数:
```c++
int main()
{
cv::Mat image(500, 500, CV_8UC3, cv::Scalar(0, 0, 0)); // 创建一个黑色图像
std::string window_name = "Drawing Circles";
cv::namedWindow(window_name);
cv::setMouseCallback(window_name, drawing, &image);
while (true)
{
cv::imshow(window_name, image);
char key = cv::waitKey(10);
if (key == 27) // 当按下ESC键退出程序
break;
}
return 0;
}
```
在鼠标左键按下并移动时,会绘制一个以按下位置为原点的圆,并以鼠标释放位置到原点距离为半径的圆。可以拖动鼠标绘制多个圆,并在图像中实时显示这些圆。按下`ESC`键退出程序。
希望以上回答能对您有所帮助。
### 回答3:
要实现在OpenCV C中鼠标拖动并显示多个圆的功能,可以按照以下步骤进行:
首先,我们需要创建一个回调函数来处理鼠标事件。在回调函数中,我们可以获取鼠标位置并根据需要进行操作。在本例中,我们将在按下鼠标左键时记录鼠标起始位置,并在鼠标拖动时计算鼠标移动的距离。根据鼠标移动的距离,我们可以确定圆的半径。
接下来,我们创建一个窗口,并将我们的回调函数与该窗口绑定。我们还需要为窗口设置鼠标事件的回调函数。
在主循环中,我们使用cv::waitKey(1)来持续监听鼠标事件。如果检测到鼠标事件,则会调用我们之前定义的鼠标事件回调函数。
在鼠标事件回调函数中,我们可以通过计算鼠标起始位置和当前位置之间的距离来确定圆的半径。然后使用cv::circle函数在图像上绘制圆。
最后,我们使用cv::imshow函数将绘制好的图像显示在窗口中。
下面是一个简单的示例代码:
#include <opencv2/opencv.hpp>
#include <iostream>
cv::Point start;
cv::Point end;
void onMouse(int event, int x, int y, int flags, void*userdata)
{
if (event == cv::EVENT_LBUTTONDOWN)
{
start = cv::Point(x, y);
}
else if (event == cv::EVENT_LBUTTONUP)
{
end = cv::Point(x, y);
int radius = cv::norm(start - end);
cv::Mat image = *(cv::Mat*)userdata;
cv::circle(image, start, radius, cv::Scalar(0, 0, 255), 2);
cv::imshow("Circle", image);
}
}
int main() {
cv::Mat image(500, 500, CV_8UC3, cv::Scalar(255, 255, 255));
cv::namedWindow("Circle");
cv::setMouseCallback("Circle", onMouse, &image);
while (true)
{
cv::imshow("Circle", image);
if (cv::waitKey(1) == 27)
break;
}
return 0;
}
运行此代码后,将会弹出一个名为"Circle"的窗口。在该窗口中,您可以拖动鼠标绘制并显示多个圆。
阅读全文