スチールウールの活動記録

初心者に向けて(私もだけど)電子工作やプログラミングや関連することをいろいろ。

OpenCV3.0を使ってみた

今回はOpenCV3.0をWindowsにインストールして使ってみたので、導入手順でも書きます。

インストール

まず最初に、OpenCVの公式サイトにいってOpenCV3.0をダウンロードします。

OpenCV | OpenCV

解凍して、お好きなディレクトリに移動してください。

Visual Studioで使えるようにする

私の使っている環境がVisual Studio 2013なので、これに合わせて説明します。

OpenCV3.0をWindows用のインストーラだと、staticlibフォルダに基本的にいつも使っているライブラリがあります。

なので、今回はスタティックライブラリを使います。

Visual Studioを開き、プロジェクトのプロパティを開きます。

  • 構成プロパティ→C/C++→全般の追加のインクルードディレクトリにOpenCV3.0のincludeをフォルダを追加
    (ex. C:\opencv\build\include)

  • 構成プロパティ→リンカー→全般の追加のライブラリディレクトリにOpenCV3.0のstaticlibのフォルダを追加
    (ex. C:\opencv\build\x86\vc12\staticlib) ←32bitで使う場合

  • 構成プロパティ→C/C++→コード生成のランタイムライブラリを

    • Debugなら マルチスレッドデバッグ
    • Releaseなら マルチスレッド
      に変更する

ライブラリのリンクのために、ヘッダーを作る。

#include "opencv2\opencv.hpp"

#pragma comment(lib,"comctl32.lib")
#pragma comment(lib,"vfw32.lib")

#define CV_VERSION_STR CVAUX_STR(CV_MAJOR_VERSION) CVAUX_STR(CV_MINOR_VERSION) CVAUX_STR(CV_SUBMINOR_VERSION)

#ifdef _DEBUG
#define CV_EXT_STR "d.lib"
#else
#define CV_EXT_STR ".lib"
#endif

#pragma comment(lib,"opencv_calib3d" CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib,"opencv_features2d" CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib,"opencv_flann" CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib,"opencv_core" CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib,"opencv_hal"CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib,"opencv_highgui"CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib,"opencv_imgcodecs"CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib,"opencv_imgproc"CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib,"opencv_ml" CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib,"opencv_objdetect" CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib,"opencv_photo" CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib,"opencv_shape" CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib,"opencv_stitching" CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib,"opencv_superres" CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib,"opencv_ts" CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib,"opencv_video" CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib,"opencv_videoio" CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib,"opencv_videostab" CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib,"IlmImf"CV_EXT_STR)
#pragma comment(lib,"ippicvmt.lib")
#pragma comment(lib,"libjasper"CV_EXT_STR)
#pragma comment(lib,"libjpeg"CV_EXT_STR)
#pragma comment(lib,"libpng"CV_EXT_STR)
#pragma comment(lib,"libtiff"CV_EXT_STR)
#pragma comment(lib,"libwebp"CV_EXT_STR)
#pragma comment(lib,"zlib"CV_EXT_STR)

以下のプログラムが実行できれば完了

#include <opencv2/opencv.hpp>
#include <opencv_lib.hpp>

int main()
{
    cv::Mat img(cv::Size(640, 480), CV_8UC3, cv::Scalar(0, 255, 0));
    cv::imshow("test", img);
    cv::waitKey();

    return 0;
}

ラベリング

OpenCV3.0からラベリングの関数が追加されたそうです。 公式のサンプルのconnected_components.cppを参考に実行してみたいと思います。

#include <opencv2/opencv.hpp>
#include <opencv_lib.hpp>
#include <iostream>
#include <vector>

using namespace cv;
using namespace std;

int main()
{
    //ラベリングをしたい画像を読み込む
    Mat img = imread("labeling_img.jpg");

    //画像の読み込み失敗した場合
    if (img.empty())
    {
        cout << "Could not read input image file" << endl;
        return -1;
    }

    //グレースケール・2値化用
    Mat gray, bin;

    //グレースケールに変換
    cvtColor(img, gray, CV_BGR2GRAY);

    //2値化
    threshold(gray, bin, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);

    //ラベリング結果用
    Mat labelImage(img.size(), CV_32S);

    //nLabelsはラベリング数、関数の8は8近傍(4なら4近傍)
    int nLabels = connectedComponents(bin, labelImage, 8);

    //ラベリング色分け用
    vector<Vec3b> colors(nLabels);

    //背景は黒にする
    colors[0] = Vec3b(0, 0, 0);

    //ランダムに色を入れていく
    for (int label = 1; label < nLabels; label++)
    {
        colors[label] = Vec3b((rand() & 255), (rand() & 255), (rand() & 255));
    }

    //ラベリング結果用
    Mat dst(img.size(), CV_8UC3);

    //色をつけていく
    for (int r = 0; r < dst.rows; r++)
    {
        for (int c = 0; c < dst.cols; c++)
        {
            int label = labelImage.at<int>(r, c);
            Vec3b &pixel = dst.at<Vec3b>(r, c);
            pixel = colors[label];
        }
    }

    //元画像表示
    imshow("img", img);

    //結果画像表示
    imshow("Connected Components", dst);

    //入力待ち
    waitKey();

    return 0;
}

今回ラベリングする画像

f:id:bhjkkk:20151126215600j:plain

ラベリング結果

f:id:bhjkkk:20151126215846j:plain

簡単にできますね。