计算机视觉实现代码1,按住鼠标左键并移动,在图片上画白色线条,标记前景,释放鼠标左键,线条结束; 2,按住 Ctrl 键和鼠标左键,移动鼠标,在图片上画黑色线条,标记背景,释放 Ctrl 键和鼠标左键,线条结束; 3,按 Enter 键,完成前景提取。
时间: 2024-04-21 11:25:47 浏览: 148
js按住鼠标左键选中元素框代码
这是一个交互式图像分割的流程,需要使用图像处理库来实现。以下是一个使用 OpenCV 库实现的示例代码:
```
import cv2
# 读取图像
img = cv2.imread('image.jpg')
# 初始化标记
mask = np.zeros(img.shape[:2], np.uint8)
bgdModel = np.zeros((1, 65), np.float64)
fgdModel = np.zeros((1, 65), np.float64)
# 定义鼠标事件回调函数
def on_mouse(event, x, y, flags, param):
global ix, iy, drawing, mode
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix, iy = x, y
elif event == cv2.EVENT_MOUSEMOVE:
if drawing == True:
if flags & cv2.EVENT_FLAG_CTRLKEY:
cv2.line(mask, (ix, iy), (x, y), (0, 0, 255), 5)
else:
cv2.line(mask, (ix, iy), (x, y), (255, 255, 255), 5)
ix, iy = x, y
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
# 注册鼠标事件回调函数
cv2.namedWindow('image')
cv2.setMouseCallback('image', on_mouse)
# 主循环
while True:
cv2.imshow('image', img)
k = cv2.waitKey(1) & 0xFF
if k == 13: # 按下 Enter 键,完成前景提取
cv2.grabCut(img, mask, None, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_MASK)
mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8')
img = img * mask2[:, :, np.newaxis]
cv2.imshow('image', img)
cv2.waitKey(0)
elif k == 27: # 按下 Esc 键,退出程序
break
# 清理资源
cv2.destroyAllWindows()
```
该代码使用了 grabCut 算法,该算法可以自动对图像进行分割,但需要提供一些初始标记。在该代码中,我们使用鼠标事件来标记前景和背景,并在按下 Enter 键后进行前景提取。
阅读全文