J'ai une image avec un cadre de sélection et je veux redimensionner l'image.
img = cv2.imread("img.jpg",3)
x_ = img.shape[0]
y_ = img.shape[1]
img = cv2.resize(img,(416,416));
Maintenant, je veux calculer le facteur d'échelle:
x_scale = ( 416 / x_)
y_scale = ( 416 / y_ )
Et dessinez une image, ceci est le code du cadre de sélection original:
( 128, 25, 447, 375 ) = ( xmin,ymin,xmax,ymax)
x = int(np.round(128*x_scale))
y = int(np.round(25*y_scale))
xmax= int(np.round (447*(x_scale)))
ymax= int(np.round(375*y_scale))
Cependant, en utilisant ceci, je reçois:
Alors que l'original est:
Je ne vois aucun drapeau dans cette logique, qu'est-ce qui ne va pas?
Code entier:
imageToPredict = cv2.imread("img.jpg",3)
print(imageToPredict.shape)
x_ = imageToPredict.shape[0]
y_ = imageToPredict.shape[1]
x_scale = 416/x_
y_scale = 416/y_
print(x_scale,y_scale)
img = cv2.resize(imageToPredict,(416,416));
img = np.array(img);
x = int(np.round(128*x_scale))
y = int(np.round(25*y_scale))
xmax= int(np.round (447*(x_scale)))
ymax= int(np.round(375*y_scale))
Box.drawBox([[1,0, x,y,xmax,ymax]],img)
et drawbox
def drawBox(boxes, image):
for i in range (0, len(boxes)):
cv2.rectangle(image,(boxes[i][2],boxes[i][3]),(boxes[i][4],boxes[i][5]),(0,0,120),3)
cv2.imshow("img",image)
cv2.waitKey(0)
cv2.destroyAllWindows()
L'image et les données du cadre de sélection sont chargées séparément. Je dessine le cadre de sélection à l'intérieur de l'image. L'image ne contient pas la boîte elle-même.
Je crois qu'il y a deux problèmes:
x_
et y_
car shape[0]
est en fait la dimension y et shape[1]
est la dimension x(160, 35)
- (555, 470)
au lieu de (128,25)
- (447,375)
que vous utilisez dans le code.Si j'utilise le code suivant:
import cv2
import numpy as np
def drawBox(boxes, image):
for i in range(0, len(boxes)):
# changed color and width to make it visible
cv2.rectangle(image, (boxes[i][2], boxes[i][3]), (boxes[i][4], boxes[i][5]), (255, 0, 0), 1)
cv2.imshow("img", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
def cvTest():
# imageToPredict = cv2.imread("img.jpg", 3)
imageToPredict = cv2.imread("49466033\\img.png ", 3)
print(imageToPredict.shape)
# Note: flipped comparing to your original code!
# x_ = imageToPredict.shape[0]
# y_ = imageToPredict.shape[1]
y_ = imageToPredict.shape[0]
x_ = imageToPredict.shape[1]
targetSize = 416
x_scale = targetSize / x_
y_scale = targetSize / y_
print(x_scale, y_scale)
img = cv2.resize(imageToPredict, (targetSize, targetSize));
print(img.shape)
img = np.array(img);
# original frame as named values
(origLeft, origTop, origRight, origBottom) = (160, 35, 555, 470)
x = int(np.round(origLeft * x_scale))
y = int(np.round(origTop * y_scale))
xmax = int(np.round(origRight * x_scale))
ymax = int(np.round(origBottom * y_scale))
# Box.drawBox([[1, 0, x, y, xmax, ymax]], img)
drawBox([[1, 0, x, y, xmax, ymax]], img)
cvTest()
et utilisez votre image "originale" sous la forme "49466033\img.png",
Je reçois l'image suivante
Et comme vous pouvez le voir, ma fine ligne bleue se situe exactement à l'intérieur de votre ligne rouge d'origine et reste là quelle que soit la variable targetSize
que vous avez choisie (la mise à l'échelle fonctionne donc correctement).
vous pouvez utiliser le resize_dataset_pascalvoc
c'est facile à utiliser python3 main.py -p <IMAGES_&_XML_PATH> --output <IMAGES_&_XML> --new_x <NEW_X_SIZE> --new_y <NEW_X_SIZE> --save_box_images <FLAG>"
Il redimensionne tout votre jeu de données et réécrit les nouveaux fichiers d'annotations en images redimensionnées