无法在 opencv 中缩放 roi python

not able to scale the roi in opencv python

import cv2
import mediapipe as mp
import time
cap = cv2.VideoCapture(0)
while True:
    _, im0 = cap.read()
    showCrosshair = False
    fromCenter = False
    r = cv2.selectROI("Image", im0, fromCenter, showCrosshair)
    break

mpHands = mp.solutions.hands
hands = mpHands.Hands(static_image_mode=False,
                      max_num_hands=2,
                      min_detection_confidence=0.5,
                      min_tracking_confidence=0.5)
mpDraw = mp.solutions.drawing_utils
pTime = 0
cTime = 0
while True:
    _, img = cap.read()
    img = cv2.rectangle(img,(r[0],r[1]),(r[2],r[3]),(0,255,0),5)
    #imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    results = hands.process(img)
    print(results.multi_hand_landmarks)
    if results.multi_hand_landmarks:
        for handLms in results.multi_hand_landmarks:
            for id, lm in enumerate(handLms.landmark):
                print(id,lm)
                h, w, c = img.shape
                cx, cy = int(lm.x *w), int(lm.y*h)
                cv2.circle(img, (cx,cy), 3, (255,0,255), cv2.FILLED)

            mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS)

    cTime = time.time()
    fps = 1/(cTime-pTime)
    pTime = cTime
    if cv2.waitKey(1) & 0xFF  == 27:
      break
    cv2.putText(img,str(int(fps)), (10,70), cv2.FONT_HERSHEY_PLAIN, 3, (255,0,255), 3)
    cv2.imshow("ThumbsDown", img)
    cv2.waitKey(1)

我正在尝试构建一个程序来检测所选感兴趣区域中的手部运动,但我执行的矩形选择确实有效,或者它未缩放。 手部检测也会在几个点随机开始工作。 任何帮助将不胜感激。

问题已解决 这是代码:

import cv2
import mediapipe as mp
import time
from shapely.geometry import Point
from shapely.geometry import polygon
from shapely.geometry.polygon import Polygon

cap = cv2.VideoCapture(0)
while True:
    _, im0 = cap.read()
    showCrosshair = False
    fromCenter = False
    r = cv2.selectROI("ThumbsDown", im0, fromCenter, showCrosshair)
    break

mpHands = mp.solutions.hands
hands = mpHands.Hands(static_image_mode=False,
                      max_num_hands=2,
                      min_detection_confidence=0.5,
                      min_tracking_confidence=0.5)
mpDraw = mp.solutions.drawing_utils
x=int(r[0])
y=int(r[1])
w=int(r[2])
h=int(r[3])
a= (x,y)
b= (x,y+h)
c= (x+w,y+h)
d= (x+w,y)
points_cord=(a,b,c,d)
points=Polygon(points_cord)
pTime = 0
cTime = 0
while True:
    _, img = cap.read()
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    rect_img = imgRGB[int(r[1]):int(r[1]+r[3]), int(r[0]):int(r[0]+r[2])]
    results = hands.process(rect_img) 
    print(results.multi_hand_landmarks)
    if results.multi_hand_landmarks:
        for handLms in results.multi_hand_landmarks:
            for id, lm in enumerate(handLms.landmark):
                print(id,lm)
                h, w, c = rect_img.shape
                cx, cy = int(lm.x *w), int(lm.y*h)
                cv2.circle(rect_img, (cx,cy), 3, (255,0,255), cv2.FILLED)
                cv2.putText(img,str("Hands-Detected"), (120,70), cv2.FONT_HERSHEY_PLAIN, 3, (252,0,0), 3)
                cv2.rectangle(img,(int(r[0]),int(r[1]+r[3])),(int(r[0]+r[2]),int(r[1])),255,3)
                cv2.rectangle(img,b,d,(25,255,231),3)
                if((cx or cy)!=0):
                    cp=Point(cx,cy)
                    if(points.contains(cp)):
                        cv2.putText(img,str("TEST"), (300,200), cv2.FONT_HERSHEY_PLAIN, 3, (25,255,231), 3)


            mpDraw.draw_landmarks(rect_img, handLms, mpHands.HAND_CONNECTIONS)
            img[int(r[1]):int(r[1]+r[3]), int(r[0]):int(r[0]+r[2])] =rect_img        
    cv2.rectangle(img,b,d,(25,255,231),3)
    cTime = time.time()
    fps = 1/(cTime-pTime)
    pTime = cTime
    if cv2.waitKey(1) & 0xFF  == 27:
      break
    cv2.putText(img,str(int(fps)), (10,70), cv2.FONT_HERSHEY_PLAIN, 3, (25,255,231), 3)
    cv2.namedWindow("ThumbsDown", cv2.WINDOW_NORMAL)
    cv2.imshow("ThumbsDown", img)
    cv2.waitKey(1)

首先,我没有将前面代码中的正确输入发送到内置 cv2.rectangle 函数。

x=int(r[0]) 
y=int(r[1]) 
w=int(r[2]) 
h=int(r[3]) 

这是我根据 cv2.rectangle 函数及其数据成员重新排列坐标的部分。 rect_img = imgRGB[int(r[1]):int(r[1]+r[3]), int(r[0]):int(r[0]+r[2])] 在这一行中,我们不仅需要 x,y,还需要宽度和高度。

其次,我没有调用正确的框架来构建矩形,rect_img = imgRGB[int(r[1]):int(r[1]+r[3]), int(r[0]):int(r[0]+r[2])] 这是选择的区域(ROI),

img[int(r[1]):int(r[1]+r[3]), int(r[0]):int(r[0]+r[2])] =rect_img 

然后我们将所选帧合并到原始输出帧。