Чтение с камеры Kinect вместо стандартной веб-камеры для обнаружения объектов в кадре - PullRequest
1 голос
/ 26 июня 2019

Я нашел два примера кода, которые выполняют отдельные задачи, которые я пытаюсь заставить работать в тандеме.

Код Fist открывает веб-камеру с моего ноутбука и считывает видеопоток, чтобы обнаружить определенный цветной объект в кадре. Затем он создает контур круглого объекта и создает цветной след его предыдущего местоположения, когда он движется в режиме реального времени.

Единственная проблема - я пытаюсь использовать Xbox 360 Kinect для работы в качестве веб-камеры, а не встроенной веб-камеры на моем ноутбуке. (В будущем я планирую также использовать камеру глубины, поэтому я хотел бы использовать камеру Kinect.)

Второй код показывает, как открыть и просмотреть видеопоток камеры Kinect.

Я обнаружил, что установка номера в VideoStream(src= 0).start() на 0 является камерой по умолчанию. Если бы я изменил это значение, скажем, 1, 2, 3 или что-то еще ... он должен прочитать следующую доступную камеру. Однако, когда я печатаю все доступные камеры, отображается только веб-камера в списке.

Я удалил, переустановил и установил все правильные драйверы и пакеты, которые мне нужны, чтобы это работало, если бы я просто поставил № 1 в этой строке кода, но мне не повезло. Должен быть другой подход, который будет работать, чтобы решить эту проблему.

--------- Первый код ----------------------------------- -------------

# import the necessary packages
from collections import deque
from imutils.video import VideoStream
import numpy as np
import argparse
import cv2
import imutils
import time

# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-v", "--video",
    help="path to the (optional) video file")
ap.add_argument("-b", "--buffer", type=int, default=64,
    help="max buffer size")
args = vars(ap.parse_args())

# define the lower and upper boundaries of the "green"
# ball in the HSV color space, then initialize the
# list of tracked points
greenLower = (53, 36, 124)
greenUpper = (200, 200, 242)
pts = deque(maxlen=args["buffer"])

# if a video path was not supplied, grab the reference
# to the webcam
if not args.get("video", False): #if not video file was given
    vs = VideoStream(src=0).start() #access the webcam here

# otherwise, grab a reference to the video file
else:
    vs = cv2.VideoCapture(args["video"])

# allow the camera or video file to warm up
time.sleep(2.0)

# keep looping
while True:
    # grab the current frame
    frame = vs.read()

    # handle the frame from VideoCapture or VideoStream
    frame = frame[1] if args.get("video", False) else frame

    # if we are viewing a video and we did not grab a frame,
    # then we have reached the end of the video
    if frame is None:
        break

    # resize the frame, blur it, and convert it to the HSV
    # color space
    frame = imutils.resize(frame, width=600)
    blurred = cv2.GaussianBlur(frame, (11, 11), 0)
    hsv = cv2.cvtColor(blurred, cv2.COLOR_BGR2HSV)

    # construct a mask for the color "green", then perform
    # a series of dilations and erosions to remove any small
    # blobs left in the mask
    mask = cv2.inRange(hsv, greenLower, greenUpper)
    mask = cv2.erode(mask, None, iterations=2)
    mask = cv2.dilate(mask, None, iterations=2)

    # find contours in the mask and initialize the current
    # (x, y) center of the ball
    cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    cnts = imutils.grab_contours(cnts)
    center = None

    # only proceed if at least one contour was found
    if len(cnts) > 0:
        # find the largest contour in the mask, then use
        # it to compute the minimum enclosing circle and
        # centroid
        c = max(cnts, key=cv2.contourArea)
        ((x, y), radius) = cv2.minEnclosingCircle(c)
        M = cv2.moments(c)
        center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"]))

        # only proceed if the radius meets a minimum size
        if radius > 10:
            # draw the circle and centroid on the frame,
            # then update the list of tracked points
            cv2.circle(frame, (int(x), int(y)), int(radius),
                (0, 255, 255), 2)
            cv2.circle(frame, center, 5, (0, 0, 255), -1)

    # update the points queue
    pts.appendleft(center)
        # loop over the set of tracked points
    for i in range(1, len(pts)):
        # if either of the tracked points are None, ignore
        # them
        if pts[i - 1] is None or pts[i] is None:
            continue

        # otherwise, compute the thickness of the line and
        # draw the connecting lines
        thickness = int(np.sqrt(args["buffer"] / float(i + 1)) * 2.5)
        cv2.line(frame, pts[i - 1], pts[i], (0, 0, 255), thickness)

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

    # if the 'q' key is pressed, stop the loop
    if key == ord("q"):
        cv2.destroyAllWindows()
        break


# close all windows
cv2.destroyAllWindows()

#----------End of the First code-----------------------------------



#------------Second Code-------------------------------------------

from pykinect import nui
import numpy
import cv2

def video_handler_function(frame):

    video = numpy.empty((480,640,4),numpy.uint8)
    frame.image.copy_bits(video.ctypes.data)

    cv2.imshow('KINECT Video Stream', video)


kinect = nui.Runtime()
kinect.video_frame_ready += video_handler_function
kinect.video_stream.open(nui.ImageStreamType.Video, 2,nui.ImageResolution.Resolution640x480,nui.ImageType.Color)

cv2.namedWindow('KINECT Video Stream', cv2.WINDOW_AUTOSIZE)

while True:

    key = cv2.waitKey(1)
    if key == 27: break

kinect.close()
cv2.destroyAllWindows()

#----------end of the second code---------------------------------

```python

When I change the value, to 1 which is the port number that the kinect is connected to, it should open the video stream and have the same results as the first code, but it just closes the python app.
...