我正在使用opencv和python,我试图检测一些游戏卡和 我被卡住了。我要复制计数器的内部区域。我已经编写了这段代码:
检测轮廓
import cv2
import numpy as np
image = frame of a video
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (1, 1), 1000)
flag, thresh = cv2.threshold(blur, 120, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = sorted(contours, key=cv2.contourArea, reverse=True)
contourns_to_draw = []
# filter the cards contour
for i in range(len(contours)):
card = contours[i]
peri = cv2.arcLength(card, True)
if (peri > 150) and (not is_in_array(card, contourns_to_draw)):
rect = cv2.boundingRect(card)
x, y, w, h = rect
if h > w:
contourns_to_draw.append(card)
img = cv2.drawContours(image, contourns_to_draw, -1, (0, 255, 0), 1)
复制轮廓区域并创建新图像
for i, contour in enumerate(contourns_to_draw):
peri = cv2.arcLength(contour, True)
approx = cv2.approxPolyDP(contour, 0.01 * peri, True)
h = np.array([[0, 0], [449, 0], [449, 449], [0, 449]], np.float32)
if len(approx) != 4 :
continue
else:
transform = cv2.getPerspectiveTransform(approx.astype(np.float32), h)
warp = cv2.warpPerspective(image, transform, (450, 450))
# warp = rotateImage(warp, -90)
warp = cv2.flip(warp, +1)
dominance_color = bincount_app(warp)
cv2.imshow("Show Boxes", warp)
key = cv2.waitKey(0) & 0xFF
当我在这样的视频帧上使用此代码时
轮廓检测效果很好,但是当它从轮廓区域创建新图像时,输出是具有随机旋转且有时也会翻转的新图像
我的目标是要有一个没有旋转且没有翻转的图像,有时输出是正确的,但其他时候就像我添加的图像一样,我并不怀疑是什么在输出中产生差异。
答案 0 :(得分:0)
OpenCV假定轮廓的第一个顶点最接近图像的上边缘。因此,取决于相机的方向,可能会导致显示效果。在您的情况下,应重新排列approx
中的顶点。参见this link for details。