web-dev-qa-db-fra.com

redimensionner une matrice après l'avoir créée dans OpenCV

Je suis nouveau sur OpenCV et je regardais le tutoriel Canny pour Edge Detection. Je cherchais comment redimensionner un mat que je viens de créer. Le code est le suivant:

 src = imread( impath );
 ...
 dst.create( src.size(), src.type() );

maintenant j'ai essayé de redimensionner le tapis avec ceci:

resize(dst, dst, dst.size(), 50, 50, INTER_CUBIC);

Mais cela ne semble rien changer.

Mes doutes sont deux: 1: Est-ce que je fais bien d'appeler resize() après create()? 2: Comment puis-je spécifier les dimensions du mat?

Mon objectif est de redimensionner l'image, si elle n'était pas claire

13
steo

Vous créez dst mat avec la même taille que src. De plus, lorsque vous appelez resize, vous transmettez à la fois la taille de destination et fx/fy facteurs d'échelle, vous devez passer quelque chose un:

Mat src = imread(...);
Mat dst;
resize(src, dst, Size(), 2, 2, INTER_CUBIC); // upscale 2x
// or
resize(src, dst, Size(1024, 768), 0, 0, INTER_CUBIC); // resize to 1024x768 resolution

MISE À JOUR: de la documentation OpenCV:

La mise à l'échelle est simplement un redimensionnement de l'image. OpenCV est fourni avec une fonction cv2.resize () à cet effet. La taille de l'image peut être spécifiée manuellement ou vous pouvez spécifier le facteur d'échelle. Différentes méthodes d'interpolation sont utilisées. Les méthodes d'interpolation préférées sont cv2.INTER_AREA pour le rétrécissement et cv2.INTER_CUBIC (lent) et cv2.INTER_LINEAR pour le zoom. Par défaut, la méthode d'interpolation utilisée est cv2.INTER_LINEAR à toutes fins de redimensionnement. Vous pouvez redimensionner une image d'entrée selon l'une des méthodes suivantes:

import cv2
import numpy as np
img = cv2.imread('messi5.jpg')
res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)
#OR
height, width = img.shape[:2]
res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC)

Aussi dans Visual C++, J'ai essayé les deux méthodes de réduction et cv::INTER_AREA fonctionne beaucoup plus rapidement que cv::INTER_CUBIC (comme mentionné par la documentation OpenCV):

cv::Mat img_dst;
cv::resize(img, img_dst, cv::Size(640, 480), 0, 0, cv::INTER_AREA);
cv::namedWindow("Contours", CV_WINDOW_AUTOSIZE);
cv::imshow("Contours", img_dst);
28
jet47