脱N00Bしたいエンジニア

N00Bなエンジニアの奮闘記録

Display Image using OpenCV with C++

OpenCVを使って画像を読み込み, ウィンドウで表示させる.
使用言語はC++

実行環境

$ brew --version
Homebrew 1.8.4
Homebrew/homebrew-core (git revision a3da; last commit 2018-11-28)
$ clang++ --version
Apple LLVM version 10.0.0 (clang-1000.10.44.4)
Target: x86_64-apple-darwin18.2.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

OpenCV インストール

Homebrew を使ってインストールを試みる.

$ brew install opencv

インストール中に以下のような問題が発生.

==> Pouring python-3.7.1.mojave.bottle.7.tar.gz
Error: An unexpected error occurred during the `brew link` step
The formula built, but is not symlinked into /usr/local
Permission denied @ dir_s_mkdir - /usr/local/Frameworks
Error: Permission denied @ dir_s_mkdir - /usr/local/Frameworks

brew link実行時に/usr/local/Frameworksのアクセス権が無くエラーが起こったようだ.
chownコマンドで権限を変更する.

# ディレクトリの作成
$ sudo mkdir /usr/local/Frameworks

# ユーザ名の確認
$ whoami

# 権限の変更
$ sudo chown $(whoami):admin /usr/local/Frameworks

# 権限の確認
$ ls -al /usr/local/ | grep Frameworks
drwxr-xr-x    3 ユーザ名  admin     96 11 28 19:46 Frameworks

参考:Homebrewで入れたPythonでのlinkエラー問題

再びインストールコマンドの実行.

# インストール
$ brew install opencv

# インストール済みパッケージから確認
$ brew list | grep opencv
opencv

# インストールされたOpenCVの情報を確認
$ brew info opencv
opencv: stable 3.4.3 (bottled)
Open source computer vision library
https://opencv.org/
/usr/local/Cellar/opencv/3.4.3 (619 files, 215.0MB) *
  Poured from bottle on 2018-11-28 at 19:47:10
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/opencv.rb
==> Dependencies
Build: cmake ✘, pkg-config ✔
Required: eigen ✔, ffmpeg ✔, jpeg ✔, libpng ✔, libtiff ✔, numpy ✔, openexr ✔, python ✔, python@2 ✔, tbb ✔
==> Analytics
install: 15,439 (30 days), 51,278 (90 days), 239,627 (365 days)
install_on_request: 14,580 (30 days), 48,034 (90 days), 218,015 (365 days)
build_error: 0 (30 days)

公式サンプルプログラム

コンパイルと実行

公式の「OpenCV: Using OpenCV with gcc and CMake」のプログラムを実行する.

ソースコードコマンドライン引数から画像のファイル名を受け取り、ファイル名の示す画像ファイルをウィンドウで表示するプログラム.

#include <stdio.h>
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char** argv )
{
    if ( argc != 2 )
    {
        printf("usage: DisplayImage.out <Image_Path>\n");
        return -1;
    }
    Mat image;
    image = imread( argv[1], 1 );
    if ( !image.data )
    {
        printf("No image data \n");
        return -1;
    }
    namedWindow("Display Image", WINDOW_AUTOSIZE );
    imshow("Display Image", image);
    waitKey(0);
    return 0;
}

ソースコードを「DisplayImage.cpp」として保存し, コンパイルする.

$ clang++ -o DisplayImage DisplayImage.cpp `pkg-config --cflags opencv` `pkg-config --libs opencv`

実行ファイルにコマンドライン引数として画像のファイル名を与えてあげると, 画像を表示してくれる.

$ ./DisplayImage 画像名

Macスクリーンショットを与えると

$ ./DisplayImage image.png 
libpng warning: iCCP: extra compressed data

という警告が出るが, これはImageMagickが余計なメタデータを扱わないためのエラーらしい.
参考:png imagemagick error: Extra compressed data - Stack Overflow

狼の画像JPGを与えてみたらなんの問題もなかった.

$ ./DisplayImage wolf-3818343_640.jpg 

ウィンドウ画面に狼の画像が表示される
出力結果: 狼の画像

CMake を使う

せっかくだからCMakeを使ってみる.

# インストール
$ brew install cmake

# 確認
$ brew list | grep cmake
cmake

CMakeLists.txtを作成する.

cmake_minimum_required(VERSION 2.8)
project( DisplayImage )
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
add_executable( DisplayImage DisplayImage.cpp )
target_link_libraries( DisplayImage ${OpenCV_LIBS} )

CMakelists.txtを元にMakefileを作成する.

$ cmake CMakeLists.txt 
-- Configuring done
-- Generating done
-- Build files have been written to: 
任意のファイルパス

Makefileが作成されているので, Makeしてコンパイルする.

# 実行ファイルなどの削除
$ make clean

# コンパイル
$ make
[ 50%] Building CXX object CMakeFiles/DisplayImage.dir/DisplayImage.cpp.o
[100%] Linking CXX executable DisplayImage
[100%] Built target DisplayImage

実行方法は前のと同じ.

$ ./DisplayImage wolf-3818343_640.jpg