Python图像处理耗时太长

时间:2018-01-06 23:45:10

标签: python numpy image-processing

我想在Python中进行图像处理。问题是我有一个循环,将图像数据从摄像机记录到一个numpy数组,但在循环中我试图将最后一个图像的像素数据与当前图像相关联,以确定我是否需要做进一步的处理。然而,这会杀死显示滞后图像输出的循环的执行速度。

def gen(camera):
    image = np.zeros([480, 640, 3])
    last_image = np.zeros([480, 640, 3])

    frame_number = 0

    while True:
        frame = camera.get_frame()
        #new code

        if(frame_number % 10 == 0):
            #save the current frame
            image = frame
            #this line takes forever on 480x640x3 sized nd.arrray
            corr = signal.correlate(image, last_image)

        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        faces = faceCascade.detectMultiScale(
                    gray,
                    scaleFactor=1.1,
                    minNeighbors=5,
                    minSize=(30, 30),
                    flags=cv2.CASCADE_SCALE_IMAGE
                )

                # Draw a rectangle around the faces
        for (x, y, w, h) in faces:
                    cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
        #cv2.imshow('Video', frame)
        ret, jpeg = cv2.imencode('.jpg', frame)
        #if cv2.waitKey(1) & 0xFF == ord('q'):
         #   break
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + jpeg.tobytes() + b'\r\n\r\n')
        if(frame_number % 10 == 0):
            #save current frame as last frame for next process 
            last_image = frame

        frame_number += 1

多线程是解决这个问题的方法吗?

1 个答案:

答案 0 :(得分:1)

我不确定它是否可行,但如果在转换为灰度后进行关联,则可以使操作更快。这将使很多上的数据相关性更少,并且可能实际上可以使用体面的FPS。

另一种方法可能是独立关联每个通道,经过快速测试后,它可能会更快地执行。

或者,对于多线程方法,您可以将不同线程上的每个RGB图像关联起来。如果速度更快的话,将会有多快找到实验。 The link from jwpfox's comment可能是一个好的开始。但是,最后我在Python中使用多处理时,存在将内存复制到每个子进程的问题。我不知道这种多处理是否会做同样的事情,但是为了未来的加速,要记住这一点。