【问题标题】:Python OpenCV - Template Matching using the live camera feed frame as inputPython OpenCV - 使用实时摄像头馈送帧作为输入的模板匹配
【发布时间】:2017-07-22 10:45:31
【问题描述】:

在我前段时间在 Android 中尝试过 OpenCV 之后,我又开始使用它了。现在,我正在使用 Python 2 尝试 OpenCV 2。到目前为止,我已经能够使用它来获取实时摄像机源,并且在一个单独的项目中,我已经能够实现模板匹配,我将给出一个父图像和一个存在于父图像中的小图像,并匹配父图像中的子图像,然后输出另一个图像,在图像匹配上绘制一个红色矩形。

这是模板匹配的代码。没什么特别的,和 OpenCV 网站上的一样:

import cv2
import numpy as np
from matplotlib import pyplot as plt
img_rgb = cv2.imread('mario.jpg')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('mario_coin.png',0)
w, h = template.shape[::-1]
res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where( res >= threshold)
for pt in zip(*loc[::-1]):
    cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)
cv2.imwrite('res.png',img_rgb)

那么至于我的 Live Camera Feed 代码,我有这个:

# import the necessary packages
from picamera.array import PiRGBArray
from picamera import PiCamera
import time
import cv2

# initialize the camera and grab a reference to the raw camera capture
camera = PiCamera()
camera.resolution = (640, 480)
camera.framerate = 32
rawCapture = PiRGBArray(camera, size=(640, 480))

# allow the camera to warmup
time.sleep(0.1)

# capture frames from the camera
for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
    # grab the raw NumPy array representing the image, then initialize the timestamp
    # and occupied/unoccupied text
    image = frame.array

    # show the frame
    cv2.imshow("Frame", image)
    key = cv2.waitKey(1) & 0xFF

    # clear the stream in preparation for the next frame
    rawCapture.truncate(0)

    # if the `q` key was pressed, break from the loop
    if key == ord("q"):
        break

到目前为止,这两个代码都运行良好,彼此独立。我尝试的是在相机流代码显示任何内容之前尝试在部分中插入模板匹配代码。

这是我想出的:

from picamera.array import PiRGBArray
from picamera import PiCamera
from matplotlib import pyplot as plt

import time
import cv2
import numpy as np


# initialize the camera and grab a reference to the raw camera capture
camera = PiCamera()
camera.resolution = (640, 480)
camera.framerate = 32
rawCapture = PiRGBArray(camera, size=(640, 480))

template = cv2.imread('mario_coin.png', 0)


# allow the camera to warmup
time.sleep(0.1)

# capture frames from the camera
for frame in camera.capture_continuous(rawCapture, format="bgr",
                                       use_video_port=True):
    # grab the raw NumPy array representing the image,
    # then initialize the timestamp
    # and occupied/unoccupied text
    image = frame.array

    # we do something here
    # we get the image or something then run some matching
    # if we get a match, we draw a square on it or something
##    img_rbg = cv2.imread('mario.jpg')
    img_rbg = image

##    img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)
    img_gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)



    w, h = template.shape[::-1]

    res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)

    threshold = 0.8

    loc = np.where(res >= threshold)

    for pt in zip(*loc[::-1]):
##        cv2.rectangle(img_rbg, pt, (pt[0] + w, pt[1] + h),
##                      (0,0,255), 2)
        cv2.rectangle(image, pt, (pt[0] + w, pt[1] + h),
                      (0,0,255), 2)

##    image = img_rgb


    # show the frame
    cv2.imshow("Frame", image)
    key = cv2.waitKey(1) & 0xFF

    # clear the stream in preparation for the next frame
    rawCapture.truncate(0)

    # if the `q` key was pressed, break from the loop
    if key == ord("q"):
        break

我想要做的是,而不是cv2.imread(sample.png),我正在尝试使用来自相机的图像输入并将其用于我之前使用的模板匹配算法中。

但是发生的情况是相机打开一秒钟(由灯指示),然后关闭,程序停止。

我真的不知道发生了什么。有没有人知道如何使用实时摄像头作为模板匹配的输入?

我正在使用带有 v1.3 摄像头的 Raspberry Pi 2。

【问题讨论】:

    标签: python python-2.7 opencv camera


    【解决方案1】:

    我已经遇到了同样的问题,问题是变量 res 当您第一次启动脚本时, res 为空,因此比较 np.where 函数中的空变量将不起作用 所以你应该放一个:

    • 条件(如果是:)
    • 异常(尝试:...除了:)

    我现在没有我的 Pi,所以这是笔记本电脑摄像头和 opencv 的相同示例:

    import cv2
    import numpy as np
    
    name = 'find.png' 
    template = cv2.imread(name,0)
    face_w, face_h = template.shape[::-1]
    
    cv2.namedWindow('image')
    
    cap = cv2.VideoCapture(0)
    
    threshold = 1
    ret = True
    
    while ret :
        ret, img = cap.read()
    
        #flip the image  ! optional 
        img = cv2.flip(img,1)
    
        img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
        res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
    
        if len(res):
            location = np.where( res >= threshold)
            for i in zip(*location[::-1]):
                #puting  rectangle on recognized erea 
                cv2.rectangle(img, pt, (pt[0] + face_w, pt[1] + face_h), (0,0,255), 2)
    
        cv2.imshow('image',img)
        k = cv2.waitKey(5) & 0xFF
        if k == 27:
            break
    cv2.destroyAllWindows()
    

    【讨论】:

      【解决方案2】:

      我实际上设法解决了它。我忘了我在这里发布了一个问题。

      from picamera.array import PiRGBArray
      from picamera import PiCamera
      from matplotlib import pyplot as plt
      
      import time
      import cv2
      import numpy as np
      
      
      # initialize the camera and grab a reference to the raw camera capture
      camera = PiCamera()
      camera.resolution = (640, 480)
      camera.framerate = 32
      rawCapture = PiRGBArray(camera, size=(640, 480))
      
      template = cv2.imread('mario_coin.png', 0)
      
      
      # allow the camera to warmup
      time.sleep(0.1)
      
      # capture frames from the camera
      for frame in camera.capture_continuous(rawCapture, format="bgr",
                                             use_video_port=True):
          # grab the raw NumPy array representing the image,
          # then initialize the timestamp
          # and occupied/unoccupied text
          image = frame.array
      
          # we do something here
          # we get the image or something then run some matching
          # if we get a match, we draw a square on it or something
          img_rbg = image
      
          img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
      
      
          template = cv2.imread("mario_coin.png", 0)
          w, h = template.shape[::-1]
      
          res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
      
          threshold = 0.8
      
          loc = np.where(res >= threshold)
      
          for pt in zip(*loc[::-1]):
              cv2.rectangle(image, (pt[1]. pt[0]), (pt[1] + w, pt[0] + h),
                            (0,0,255), 2)
      
          # show the frame
          cv2.imshow("Frame", img_rbg)
          key = cv2.waitKey(1) & 0xFF
      
          # clear the stream in preparation for the next frame
          rawCapture.truncate(0)
      
          # if the `q` key was pressed, break from the loop
          if key == ord("q"):
              break
      

      【讨论】:

        猜你喜欢
        • 2011-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多