2013-07-08 15 views
6

Sono nuovo di OpenCV e stavo guardando il tutorial Canny per Edge Detection. Stavo cercando come ridimensionare un mat appena creato. Il codice è questo:ridimensiona una matrice dopo averla creata in OpenCV

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

ora ho cercato di ridimensionare il tappeto con questo:

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

ma non sembra cambiare nulla.

I miei dubbi sono due: : Sto facendo bene chiamare resize() dopo create()? : Come specificare le dimensioni dello mat?

Il mio obiettivo è quello di ridimensionare l'immagine, se non fosse chiaro

risposta

17

Si crea dst tappeto con le stesse dimensioni di src. Anche quando si chiama resize passate sia la dimensione di destinazione e fx/fy fattori di scala, si dovrebbe passare qualcosa che uno:

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 

UPDATE: dalla documentazione OpenCV:

Scaling è solo il ridimensionamento dell'immagine . OpenCV viene fornito con una funzione cv2.resize() per questo scopo. La dimensione dell'immagine può essere specificata manualmente oppure è possibile specificare il fattore di scala. Vengono utilizzati diversi metodi di interpolazione . I metodi di interpolazione preferibili sono cv2.INTER_AREA per il restringimento e cv2.INTER_CUBIC (lento) & cv2.INTER_LINEAR per lo zoom. Per impostazione predefinita, il metodo di interpolazione utilizzato è cv2.INTER_LINEAR per tutti gli scopi di ridimensionamento. È possibile ridimensionare un'immagine in ingresso uno dei seguenti metodi:

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) 

Inoltre Visual C++, ho provato entrambi i metodi per contrazione e cv::INTER_AREA opere significativamente più veloce di cv::INTER_CUBIC (come detto da OpenCV documentazione):

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); 
Problemi correlati