web-dev-qa-db-ja.com

OpenCVで作成したマトリックスのサイズを変更する

私はOpenCVを初めて使用し、エッジ検出のCannyチュートリアルを見ていました。作成したmatのサイズを変更する方法を探していました。コードはこれです:

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

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

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

しかし、それは何も変更しないようです。

私の疑問は2つです:1resize()の後にcreate()を呼び出すのはうまくいっていますか? 2matの次元を指定するにはどうすればよいですか?

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

13
steo

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

PDATE: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_AREAcv::INTER_CUBICよりもはるかに高速に機能します(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