opencv 中定义512×512的画布,双击鼠标左键开始绘制一个指定大小的圆,按<ESC>键退出
时间: 2024-11-13 14:18:49 浏览: 15
在OpenCV中,创建一个512x512的画布并响应鼠标事件通常需要结合PyQt等GUI库一起使用,因为OpenCV本身并不直接支持图形用户界面。以下是基本步骤的一个示例:
首先,你需要安装必要的库,如`opencv-python`, `numpy`, 和 `pyqt5`(或其他类似库,如`pyqt4`)。然后,你可以使用以下Python代码来实现这个功能:
```python
import cv2
import numpy as np
from PyQt5.QtWidgets import QApplication, QWidget, QPainter, QPushButton, QVBoxLayout
from PyQt5.QtGui import QImage, QPixmap, QPainterPath
from PyQt5.QtCore import Qt, QEvent
class DrawingCanvas(QWidget):
def __init__(self):
super().__init__()
self.image = np.zeros((512, 512, 3), dtype=np.uint8)
self.path = QPainterPath()
self画画模式 = False
self.radius = 0
self.init_ui()
def init_ui(self):
self.setFixedSize(512, 512)
self.setWindowTitle('OpenCV Canvas')
self.setMouseTracking(True)
self.btn_start_stop = QPushButton('Start Draw', clicked=self.toggle_draw_mode)
layout = QVBoxLayout()
layout.addWidget(self.btn_start_stop)
self.setLayout(layout)
def paintEvent(self, event):
painter = QPainter(self)
painter.drawImage(event.rect(), QImage(self.image.data, self.width(), self.height(), QImage.Format_RGB888))
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton and not self画画模式:
self画画模式 = True
self.radius = min(event.x(), event.y()) // 2
self.path.addCircle(event.pos(), self.radius)
elif event.button() == Qt.LeftButton and self画画模式:
self.path.lineTo(event.pos())
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton:
self画画模式 = False
painter = QPainter(self)
painter.drawPath(self.path)
def mouseMoveEvent(self, event):
if self画画模式:
self.path.lineTo(event.pos())
def keyPressEvent(self, event):
if event.key() == Qt.Key_Escape:
self.quit()
def quit(self):
self.close()
if __name__ == "__main__":
app = QApplication([])
canvas = DrawingCanvas()
canvas.show()
app.exec_()
```
在这个例子中,我们创建了一个名为`DrawingCanvas`的窗口,并实现了鼠标点击、移动和释放事件的处理。当按下左键并且未处于绘画模式时,会进入绘画模式;在绘画模式下,会沿着鼠标轨迹绘制圆形。当你按下ESC键时,程序会退出。
阅读全文