17

私はOpenCVが初めてで、エッジ検出のCannyチュートリアルを見ていました。mat作成したばかりのサイズを変更する方法を探していました。コードは次のとおりです。

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

今、私はこれでマットのサイズを変更しようとしました:

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

しかし、何も変わっていないようです。

私の疑問は 2 つ あります2 : の寸法はどのように指定すればよいですか?resize()create()mat

私の目標は、画像が明確でない場合、画像のサイズを変更することです

4

1 に答える 1

34

dstと同じサイズのマットを作成しますsrc。また、呼び出しresize先のサイズとfx/fy倍率の両方を渡す場合は、次のいずれかを渡す必要があります。

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

更新:OpenCVドキュメントから:

スケーリングとは、画像のサイズを変更することです。OpenCV には、この目的のために関数 cv2.resize() が付属しています。画像のサイズは手動で指定するか、倍率を指定できます。さまざまな補間方法が使用されます。推奨される補間方法は、縮小用の cv2.INTER_AREA とズーム用の cv2.INTER_CUBIC (遅い) & cv2.INTER_LINEAR です。デフォルトでは、すべてのサイズ変更目的で使用される補間方法は cv2.INTER_LINEAR です。次のいずれかの方法で、入力画像のサイズを変更できます。

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)

また、 ではVisual C++、両方の縮小方法を試してみましたが、 (ドキュメントに記載されているように)cv::INTER_AREAよりも大幅に高速に動作します。cv::INTER_CUBICOpenCV

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);
于 2013-07-08T18:59:55.853 に答える