Mat imgthreshold; Mat imgsrc = cv::imread("C:/Users/Dell/Pictures/Camera Roll/OIP-C (1).jfif",0); imshow("imgsrc", imgsrc); threshold(imgsrc, imgthreshold,50, 110, THRESH_BINARY); imshow("imgthreshold", imgthreshold); vector<vector<Point>> contours; findContours(imgthreshold, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); // imgdraw = imgsrc.clone(); Mat imgdraw = Mat::zeros(imgthreshold.size(), CV_8UC3); drawContours(imgdraw, contours, -1, Scalar(0, 0, 255), 1); imshow("imgdraw", imgdraw); waitKey(0);这段代码中如何用qt来实现在ui上将opencv输出的轮廓根据鼠标事件删除
时间: 2024-03-16 16:44:06 浏览: 91
要在Qt中实现此功能,您需要在Qt的UI界面中添加一个QLabel控件来显示OpenCV输出的图像。在QLabel上,您可以使用事件过滤器来处理鼠标事件,以便删除轮廓。
首先,将OpenCV的图像数据转换成Qt支持的QImage格式,然后将其设置为QLabel的背景。您可以使用以下代码来实现:
```c++
Mat imgthreshold;
Mat imgsrc = cv::imread("C:/Users/Dell/Pictures/Camera Roll/OIP-C (1).jfif",0);
QImage img = QImage((const unsigned char*)(imgsrc.data), imgsrc.cols, imgsrc.rows, QImage::Format_Grayscale8);
ui->label->setPixmap(QPixmap::fromImage(img));
```
接下来,您需要在QLabel上安装事件过滤器,并在事件过滤器中处理鼠标事件。以下是一个示例事件过滤器:
```c++
bool MyEventFilter::eventFilter(QObject *object, QEvent *event)
{
if (object == ui->label && event->type() == QEvent::MouseButtonPress)
{
QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
QPoint pos = mouseEvent->pos();
// TODO: 根据鼠标位置删除轮廓
return true;
}
return false;
}
```
在上面的代码中,您可以看到我们检查了事件类型是否为`QEvent::MouseButtonPress`,如果是,则获取鼠标事件的坐标,并执行删除轮廓的操作。
最后,您需要在Qt的UI中将事件过滤器安装到QLabel上,以便处理鼠标事件。您可以使用以下代码来实现:
```c++
MyEventFilter *eventFilter = new MyEventFilter(ui);
ui->label->installEventFilter(eventFilter);
```
这里,我们创建了一个自定义的事件过滤器对象`MyEventFilter`,并将其安装到QLabel上,以便在QLabel上处理鼠标事件。
阅读全文