python - 本地网络摄像头和网络应用网络摄像头中不同的 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_image
and video
,但输出的是一些分散的颜色video
。我尝试使用更小len(good)
的,但它并没有解决问题。本地与网络应用程序有任何差异吗?我不知道这是什么根本原因,所以我在网上找不到类似的解决方案。任何帮助将不胜感激!!
解决方案
推荐阅读
- php - 如何在 PHP 中构建具有多个参数的 WHERE 子句
- java - java: SQL_Exception 处理
- python - networkx 力有向图
- css -
标签应根据文本动态增加大小 - reactjs - react-redux 中的打字稿错误:“在构造函数之外或在构造函数内的嵌套函数中不允许超级调用”
- android - 如何在 webview 中聚焦文本字段时隐藏 Android 软键盘?
- angular - 从 2019-08-08T20:41:00-1000 转换为 2019 年 8 月 8 日 08:41 PM HST
- azure-logic-apps - 当结果集在逻辑应用中有一条记录时,Foreach 不支持
- wget - 领事服务给了我一个 403 禁止
- python - 将模型参数的平方和添加到损失函数