1.png, 2.png, 3.png …..というような連番ファイルを読み込む方法を紹介します。今回はimg[0~10の数字].pngという規則性のある連番画像を読み込み、縦横0.5倍に縮小してからout[0~10の数字].pngという名前で画像を書き出すサンプルです。画像は全てimagesフォルダの中にあり、書き出しもこのフォルダの中に行います。
#include "opencv/cv.h"
#include "opencv/highgui.h"
using namespace std;
using namespace cv;
int main(){
for(int i=1;i<=10;i++){
string filename_i="images/img"+to_string(i)+".png";
Mat src = imread(filename_i,IMREAD_UNCHANGED);
resize(src,src,Size(),0.5,0.5);
imshow("src",src);
string filename_o="images/out"+to_string(i)+".png";
imwrite(filename_o, src);
cout << filename_i << " " << filename_o << endl;
waitKey(100);
}
}
to_string関数は引数に受け取った数値をstring型の文字列 filename_iに変換します。string型の文字列は+演算子によって結合できるので、入力ファイルのパスを作成します。このサンプルの場合だと、例えばi=5の時にはimages/img5.pngというようなファイルパスが作成されます。imread関数はstring型の文字列をファイルパスとして受け取ることができるので、filename_iをimread関数に渡すと画像を読み込めます。IMREAD_UNCHANGEDはグレースケール化などせずにそのまま読み込むという意味です。IMREAD_GRAYSCALEを指定してカラー画像を読み込んだ場合は自動的にグレースケール化されます。
次にresize関数で大きさを縦横半分にしています。resize関数についてはこちらの詳しく解説しています。
最後に書き出しの部分ですが、imwrite関数もstring型の文字列をファイルパスとして受け取ることができるので、読み込み用と同様に作成した、書き出しファイルパスを引数に渡します。
同様の内容をPythonで記述すると次のようになります。
import cv2
import numpy as nap
for i in range(1,10):
filename_i = "images/img"+str(i)+".png"
img = cv2.imread(filename_i)
h = img.shape[0]
w = img.shape[1]
resized = cv2.resize(img,(h/2,w/2))
cv2.imshow("resized",resized)
filename_o = "images/out"+str(i)+".png"
cv2.imwrite(filename_o,resized)
cv2.waitKey(100)