我看不出什么问题.
主要问题是,plt.show()
正在等待,直到您关闭窗口,这将阻塞其余的代码.
它需要plt.show(block=False)
,这也需要plt.pause(0.001)
,所以它将有时间更新窗口中的图像.
plt.show(block=False)
plt.pause(0.001)
另一个问题是,在每个循环中运行ROI,所以在 Select 后,必须使用一些布尔变量来跳过它
select_roi = True
while cap.isOpened():
# ... code ...
if select_roi:
fig = plt.figure()
plt.imshow(img, interpolation='nearest', cmap="Greys")
plt.title("Click on the button to add a new ROI")
# Draw multiple ROIs
multiroi_named = MultiRoi(roi_names=['My first ROI', 'My second ROI'])
select_roi = False
# ... code ...
或者你应该在循环之前 Select ROI
fig = plt.figure()
plt.imshow(img, interpolation='nearest', cmap="Greys")
plt.title("Click on the button to add a new ROI")
# Draw multiple ROIs
multiroi_named = MultiRoi(roi_names=['My first ROI', 'My second ROI'])
while cap.isOpened():
# ... code ...
另一个问题是waitKey
,只有当你用cv2.imshow(...)
显示图像,但你不使用它,所以waitKey
将不会得到关键点.
另一个问题是,cv2提供了BGR
种 colored颜色 的图像,但matplotlib
需要RGB
种 colored颜色 ——所以你必须转换它.
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
完整工作代码:
带有布尔变量select_roi
的版本
import cv2
from matplotlib import pyplot as plt
from roipoly import MultiRoi
#cap = cv2.VideoCapture(0) # my built-in webcam
cap = cv2.VideoCapture(1)
select_roi = True # default value as start
while cap.isOpened():
val, img = cap.read()
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
if select_roi:
# Show the image
fig = plt.figure()
plt.imshow(img, interpolation='nearest', cmap="Greys")
plt.title("Click on the button to add a new ROI")
# Draw multiple ROIs
multiroi_named = MultiRoi(roi_names=['My first ROI', 'My second ROI'])
select_roi = False
# --- after if ---
# Draw all ROIs
plt.imshow(img, interpolation='nearest', cmap="Greys")
roi_names = []
for name, roi in multiroi_named.rois.items():
roi.display_roi()
#roi.display_mean(img)
roi_names.append(name)
plt.legend(roi_names, bbox_to_anchor=(1.2, 1.05))
plt.show(block=False)
plt.pause(0.001)
循环前具有ROI的版本
import cv2
from matplotlib import pyplot as plt
from roipoly import MultiRoi
#cap = cv2.VideoCapture(0) # my built-in webcam
cap = cv2.VideoCapture(1)
val, img = cap.read()
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# Show the image
fig = plt.figure()
plt.imshow(img, interpolation='nearest', cmap="Greys")
plt.title("Click on the button to add a new ROI")
# Draw multiple ROIs
multiroi_named = MultiRoi(roi_names=['My first ROI', 'My second ROI'])
while cap.isOpened():
val, img = cap.read()
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# Draw all ROIs
plt.imshow(img, interpolation='nearest', cmap="Greys")
roi_names = []
for name, roi in multiroi_named.rois.items():
roi.display_roi()
#roi.display_mean(img)
roi_names.append(name)
plt.legend(roi_names, bbox_to_anchor=(1.2, 1.05))
plt.show(block=False)
plt.pause(0.001)
BTW:如果您需要矩形ROI,则有cv2.selectROI()
个区域可供 Select ,cv2.cv2.selectROIs()
个区域可供 Select
results = cv2.selectROIs('image', img)
它不需要从BGR
转换到RGB
.