音楽的でテクノロジー的なブログ

音楽とテクノロジーを愛する、エンジニア1年生なブログ。

【OpenCV】複数の画像ファイルを読み込む方法

OpenCVはあまり関係ないが、ファイルの読み込みに関する初心者向けのTips。
画像処理などを行っていると複数の画像を読み込みたいシーンはあるはず。
例えば、複数画像に対してヒストグラムや特徴量を検出するとき、複数画像に対してマッチング処理を行うとき、もしくはテンプレート画像を複数枚数読み込むときなど。
今回はそのようなシーンで活躍するTipsを紹介する。

動作環境

項目 内容
OS macOS Sierra 10.12.2
OpenCV 2.4.13.1
Xcode 8.2.1
言語 C++

複数画像の入力方法

一般的な画像の入力

サンプルコードなどを参考に複数画像を読み込もうとすると以下のようなコードになる。

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;
using namespace std;

int main(int argc, char *argv[]){
    
    Mat search_img[10];
    
    search_img[0] = imread("./image/img1.bmp", 1);
    search_img[1] = imread("./image/img2.bmp", 1);
    search_img[2] = imread("./image/img3.bmp", 1);
    search_img[3] = imread("./image/img4.bmp", 1);
    search_img[4] = imread("./image/img5.bmp", 1);
    
    imshow("search_1", search_img[0]);
    imshow("search_2", search_img[1]);
    imshow("search_3", search_img[2]);
    imshow("search_4", search_img[3]);
    imshow("search_5", search_img[4]);
    
    waitKey(0);
}

数枚の読み込みだとこれでも問題ないが、例えば100枚読み込む必要がある場合、コピペでも面倒だしコードは長くなる一方なので好ましくない。
加えて、テンプレート画像の入力が必要な場合や、画像処理のコードが加わるとなるとさらに長くなってしまう。

複数画像の入力

そこで少し強引だが、読み込むファイル名をプログラム側で生成することで対応した。
入力画像のファイル名を連番で用意する必要があるが、たった数行のコードで数百枚の画像を読み込むことができる。

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

#define MAX_IMAGESIZE 100 //読み込む画像枚数を多めに定義

using namespace cv;
using namespace std;

int main(int argc, char *argv[]){
    
    int src_size = 0;

    Mat search_img[MAX_IMAGESIZE];
    
    for (int i = 0; i < MAX_IMAGESIZE; i++ ){
        search_img[i] = imread("./image/img" + to_string(i+1) + ".bmp", 1); //画像のディレクトリ、ファイル名、拡張子を指定
        if(!search_img[i].data) break; //全ての画像を(連番で)読み込み終えるとループを抜ける
        src_size++; //読み込まれた画像枚数をカウント
    }
    
    
    for (int i = 0; i < src_size; i++ ){
        imshow("search_" + to_string(i+1) , search_img[i]); //入力された画像を表示するウィンドウを自動で生成
    }
    
    waitKey(0);
}

※上記のサンプルでは、カレントディレクトリのimageフォルダに格納されているimg1.bmp, img2.bmp, img3.bmp, ...の画像を読み込んでいるため、ファイル名や拡張子は環境によって変更すること。

余談だが、macOSのFinderであれば複数画像選択右クリック◯項目の名前を変更を選択することで以下のように自動で連番をつけることができる。

さいごに

今回は画像の入力について紹介したが、上記のような画像の表示や画像処理などのシーンでも活用することができる。