我試圖通過我的網路攝像頭流創建多個 ROI。我使用了這個名為 roipoly 的庫(https://github.com/jdoepfert/roipoly.py)
我修改了示例代碼 (examples/multi_roi_example.py) 以在 webcam 上作業,現在看起來像這樣
import logging
import cv2
import numpy as np
from matplotlib import pyplot as plt
from roipoly import MultiRoi
logging.basicConfig(format='%(levelname)s ''%(processName)-10s : %(asctime)s '
'%(module)s.%(funcName)s:%(lineno)s %(message)s',
level=logging.INFO)
cap = cv2.VideoCapture(1)
while cap.isOpened():
# Create image
val,img =cap.read()
#img = np.ones((100, 100)) * range(0, 100)
# 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'])
# 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()
# Let OpenCV manage window events
key = cv2.waitKey(50)
# If ESCAPE key pressed, stop
if key == 27:
cap.release()
但問題是,在繪制 ROI 之后,視頻流仍然暫停并且永遠不會繼續。如何恢復網路攝像頭流及其頂部的 ROI
uj5u.com熱心網友回復:
我看到幾個問題。
主要問題是plt.show()等待關閉視窗,這會阻塞其余代碼。
它需要plt.show(block=False)并且這也需要,plt.pause(0.001)因此它有時間更新視窗中的影像。
plt.show(block=False)
plt.pause(0.001)
另一個問題是您在每個回圈中都運行 ROI - 因此您必須在選擇后使用一些布爾變數來跳過它
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 ...
或者您應該在回圈之前選擇 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但matplotlib需要RGB- 所以你必須轉換它。
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)
順便說一句:如果您需要矩形 ROI,則cv2.selectROI()選擇一個區域并cv2.cv2.selectROIs()選擇多個區域
results = cv2.selectROIs('image', img)
并且它不需要從轉換BGR為RGB.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/457149.html
標籤:Python opencv matplotlib 投资回报率
上一篇:如何從影像中提取污點?
下一篇:文本行分割
