首页 > 解决方案 > 本地网络摄像头和网络应用网络摄像头中不同的 OpenCV 增强输出

问题描述

我正在尝试在网络应用程序中应用这个图像增强项目。我在我的笔记本电脑上进行了本地尝试,它运行良好,但是当我将它加载到我的网络应用程序上时,它无法输出相同的结果。运行函数时没有发生错误,所以我不知道要查找什么。

class VideoTest(object):
    def __init__(self):
        self.cap = cv2.VideoCapture(0)
        self.cards = Card.objects.get(id=2)
        self.target_image = cv2.imread(self.cards.card_image.path)
        self.video = cv2.VideoCapture(self.cards.card_video.path)
    
    
    def __del__(self):
        self.cap.release()

    def get_frame(self):
        success, webcam_input_image = self.cap.read() 
        success, video_image = self.video.read() 
        hi, wi, ci = self.target_image.shape 
        video_image = cv2.resize(video_image, (wi, hi))
        
        detection = False
        frame_counter = 0 
        
        orb = cv2.ORB_create(nfeatures=1000)
        kp1, des1 = orb.detectAndCompute(self.target_image, None) 
        target_image = cv2.drawKeypoints(self.target_image, kp1, None)
        augment_image = webcam_input_image.copy()
        kp2, des2 = orb.detectAndCompute(webcam_input_image, None)
        webcam_image = cv2.drawKeypoints(webcam_input_image, kp2, None)
    
        if detection == False:
            self.video.set(cv2.CAP_PROP_POS_FRAMES, 0)
            frame_counter = 0
        else:
            if frame_counter == self.video.get(cv2.CAP_PROP_FRAME_COUNT):
                self.video.set(cv2.CAP_PROP_POS_FRAMES, 0)
                frame_counter = 0
            success, video_image = self.video.read()
            video_image = cv2.resize(video_image, (wi, hi))

        bf = cv2.BFMatcher()
        matches = bf.knnMatch(des1, des2, k=2)
        good = []
        for m, n in matches:
            if m.distance < 0.75*n.distance:
                good.append(m)
        img_features = cv2.drawMatches(target_image, kp1, webcam_image, kp2, good, None, flags=2)
        print('len good', len(good))
 
        if len(good) > 30:
            detection = True
            src_points = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)
            dst_points = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2)
            matrix, mask = cv2.findHomography(src_points, dst_points, cv2.RANSAC, 5)
            points = np.float32([[0, 0], [0, hi], [wi, hi], [wi, 0]]).reshape(-1, 1, 2)
            dest = cv2.perspectiveTransform(points, matrix)
            img2 = cv2.polylines(webcam_image, [np.int32(dest)], True, (255, 0, 255), 3)
            warp_image = cv2.warpPerspective(video_image, matrix, (webcam_image.shape[1], webcam_image.shape[0]))
            mask_new = np.zeros((webcam_image.shape[0], webcam_image.shape[1]), np.uint8)
            cv2.fillPoly(mask_new, [np.int32(dest)], (255, 255, 255))
            mask_inversed = cv2.bitwise_not(mask_new)
            augment_image = cv2.bitwise_and(augment_image, augment_image, mask=mask_inversed)
            augment_image = cv2.bitwise_or(warp_image, augment_image)

        cv2.waitKey(1)
        frame_counter += 1

        ret, jpg = cv2.imencode('.jpg', augment_image)
        return jpg.tobytes()

def gen_test(camera):
    while True:
        frame = camera.get_frame()
        yield(b'--frame\r\n'
              b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')

def card_player(request):
    camera = VideoTest()
    return StreamingHttpResponse(gen_test(camera), content_type="multipart/x-mixed-replace;boundary=frame")

target_image该函数在 中寻找webcam_input_image它播放 的区域video。增强的视频存储在augment_image. 该函数card_player将帧返回到使用 Django 映射的网页。代码找到了正确的target_imageand video,但输出的是一些分散的颜色video。我尝试使用更小len(good)的,但它并没有解决问题。本地与网络应用程序有任何差异吗?我不知道这是什么根本原因,所以我在网上找不到类似的解决方案。任何帮助将不胜感激!!

标签: pythondjangoopencvwebcam

解决方案


推荐阅读