首页 > 解决方案 > cv2.putText 文本在下一个 cv2.read 后保留在图像中

问题描述

我正在为我的硕士论文编写一些代码。有两个线程,一个执行 cv2.VideoCapture(),设置就绪 Event(),在第二个线程中,while 循环等待设置事件,然后进行一些图像处理。典型的生产者、消费者问题。

问题是,我正在尝试创建场景的“模型”,我只会在没有红色圆圈的区域更新像素,我将其用作检测对象位置的标记。我需要记住红色标记后面的部分图像,然后在其他地方更新区域。

问题是,我需要标记红色圆圈的中心。我使用 cv2.circle()。黑点不知何故进入了模型,尽管我从来没有把它放在那里。cv2.putText() 函数也有同样的问题。代码看起来像这样。

if __name__ == "__main__":
    ready = Event()
    vs = VideoStream(0, ready).start()
    v = Vision(vs.read())
    cv2.imshow('firework', v.getImg())

    while cv2.getWindowProperty('firework', cv2.WND_PROP_VISIBLE) >= 1: 
        # data acquisition
        while not ready.isSet():
            pass
        img = vs.read()
        ready.clear()

        # image processing
        v.updateImg(img)
        v.detectRedMarker() # set cX, cY
        mask = v.getROIMask(radius=100)
        v.updateModel(mask) # circle mask, center cX, cY

        # extras
        img = v.putMarkerToImg(img)
        cv2.imshow('firework', img)

        if cv2.waitKey(1) == ord(' '):
            break
    vs.stop()

Vision 类中的方法...

def updateImg(self, img):
    self.img = img
    self.imgGray = cv2.cvtColor(self.img,cv2.COLOR_BGR2GRAY)
    return

def getROIMask(self,radius):
    mask = np.zeros((self.imgHeight, self.imgWidth),np.uint8)
    cv2.circle(mask, (self.cX, self.cY), radius, 1, thickness=-1)
    return mask

def updateModel(self,mask):
    modelUpdate = cv2.bitwise_and(self.imgGray, cv2.bitwise_not(mask*255))
    modelOld = cv2.bitwise_and(self.model, (mask*255))
    self.model = cv2.add(modelOld,modelUpdate)
    return

如您所见,我在更新模型后将点放在红色标记的中心,然后在下一次迭代中读取新图像。黑点不知何故进入了模型。谁能建议这是怎么发生的?

标记红色圆圈中心的黑点不知何故进入模型

标签: pythonopencvimage-processingcv2

解决方案


推荐阅读