我试图在我的网络摄像头流上创建多个ROI.我使用了这个名为Roiply(https://github.com/jdoepfert/roipoly.py)的库

我修改了示例代码(examples/multi_roi_example.py)来处理网络摄像头,现在看起来是这样的

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

推荐答案

我看不出什么问题.

主要问题是,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.

Python相关问答推荐

如何将自动创建的代码转换为类而不是字符串?

如何计算部分聚合数据的统计数据

具有多个组的条形图的不同y标度

如何编写一个正规表达式来查找序列中具有2个或更多相同辅音的所有单词

Python -根据另一个数据框中的列编辑和替换数据框中的列值

剧作家Python没有得到回应

在内部列表上滚动窗口

如何使用LangChain和AzureOpenAI在Python中解决AttribeHelp和BadPressMessage错误?

2D空间中的反旋算法

如何列举Pandigital Prime Set

如何使用根据其他值相似的列从列表中获取的中间值填充空NaN数据

如何使用数组的最小条目拆分数组

如何在Django基于类的视图中有效地使用UTE和RST HTIP方法?

Telethon加入私有频道

计算每个IP的平均值

如何在Python中找到线性依赖mod 2

如何在PySide/Qt QColumbnView中删除列

Geopandas未返回正确的缓冲区(单位:米)

如何检测鼠标/键盘的空闲时间,而不是其他输入设备?

如何将数据帧中的timedelta转换为datetime