連番画像を読み込む

1.png, 2.png, 3.png …..というような連番ファイルを読み込む方法を紹介します。今回はimg[0~10の数字].pngという規則性のある連番画像を読み込み、縦横0.5倍に縮小してからout[0~10の数字].pngという名前で画像を書き出すサンプルです。画像は全てimagesフォルダの中にあり、書き出しもこのフォルダの中に行います。

seqf
#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)