2015.09.14
Visual Studio 2015でlibdecodeqrを利用してQRコードを読み取る
Visual Studio 2015開発環境で、OpenCVとlibdecodeqrを利用して、ウェブカメラから撮影したイメージからQRコードを読み取る簡単なアプリケーションを作成してみました。
Visual Studio 2015開発環境でOpenCVを動かす環境は既に構築されている前提条件とします。
まだ上記の環境になっていない場合は、以下のリンク先を参考して環境を構築しましょ~!
開発環境は以下となります。
- OS:Windows 10 64bit
- 開発ツール:Visual Studio 2015 Community
- 言語:C++
- libdecodeqrをダウンロード
- libdecodeqrのライブラリを作成
- Windows 環境変数設定
- Visual Studio 2015 設定
- テストアプリケーション作成
libdecodeqrをダウンロード
GitHubからlibdecodeqrをダウンロードします。 ダウンロードしたファイルを解凍して、テストアプリケーションが参考するライブラリの場所に配置しましょ~!筆者は「C:\dev\lib\libdecodeqr」に配置しました。 「C:\dev\lib\libdecodeqr-master\libdecodeqr\libdecodeqr.dsw」をVisual Studio 2015で開きます。 Visual Studio 2015でlibdecodeqr.dswを開いたら以下の画面がウェブブラウザに表示されますが、無視しましょ~!libdecodeqrのライブラリを作成
libdecodeqrのプロジェクトが開けましたら、プラットフォームをx64に設定しましょ~! 「ビルド>構成マネージャー」で設定ができます。 libdecodeqrをビルドする時は、OpenCVのライブラリを利用しますので、OpenCVのライブラリを読み込める環境設定をおこないましょ~! OpenCVの「includeフォルダ」を指定するために、ソリューションエクスプローラーのプロジェクト名でマウスを右クリックして、メニューを表示させます。メニューから「プロパティ」を選択してプロジェクトのプロパティページを開きます。プロジェクトのプロパティページの左側のツリーで「構成プロパティ>C/C++>全般」を選択します。右側の設定画面に「追加のインクルドディレクトリ」が見えますね?そこに「C:\dev\lib\opencv-2.4.11\build\include;C:\dev\lib\opencv-2.4.11\build\include\opencv」を設定します。 次は、ビルドモードに「Release」を選択します。 これで、ビルドの準備ができました。ビルドをしましょ~! 以下のようにビルドが成功しました。ライブラリファイルができたか確認しましょ~!生成場所は「C:\dev\lib\libdecodeqr-master\libdecodeqr\Release」です。 ライブラリファイルも生成されていますね。Windows 環境変数設定
ライブラリ作成が終わったら、Windowsの環境変数のpathに作成したライブラリを登録しましょ~!Visual Studio 2015 設定
次はVisual Studio 2015の設定です。テストアプリケーションのプロジェクトがOpenCVとlibdecodeqrを認識できるように「includeフォルダ」と「ライブラリフォルダ」を設定します。 まず、「ファイル>新規作成>プロジェクト」をクリックして、Win32コンソールアプリケーションの新規プロジェクトを作成しましょ~! プロジェクトが生成されたら、x64用アプリケーションを作成するように構成を変更しましょ~!「ビルド>構成マネージャー」をクリックして、アクティブソリューションプラットフォームを「x86」から「x64」に変更します。 これからOpenCVとlibdecodeqrの「includeフォルダ」を指定します。 ソリューションエクスプローラーのプロジェクト名でマウスを右クリックして、メニューを表示させます。メニューから「プロパティ」を選択してプロジェクトのプロパティページを開きます。プロジェクトのプロパティページの左側のツリーで「構成プロパティ>C/C++>全般」を選択します。右側の設定画面に「追加のインクルドディレクトリ」が見えますね?そこに「C:\dev\lib\opencv-2.4.11\build\include;C:\dev\lib\opencv-2.4.11\build\include\opencv;C:\dev\lib\libdecodeqr-master\libdecodeqr」を設定します。 次は、「ライブラリフォルダ」を指定します。 プロジェクトのプロパティページの左側のツリーで「構成プロパティ>リンカ―>全般」を選択します。右側の設定画面に「追加のライブラリディレクトリ」が見えますね?そこに「C:\dev\lib\opencv-2.4.11\build\x64\vc12\lib;C:\dev\lib\libdecodeqr-master\libdecodeqr\Release」を設定します。 これで、コーディングの準備が終わりました。テストアプリケーション作成
以下のようにソースコードを作成しましょ~!コーディングが終わったら「Ctrl+F5」を押下し、作成したアプリケーションを実行してみましょ~! もし、以下のようなエラーメッセージが出力されたら、プロジェクトのプロパティページの左側のツリーで「構成プロパティ>C/C++>全般」を選択します。右側の設定画面の「SDLチェック」を「いいえ(/sdl-)」に設定します。// libdecodeqr_test.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
#define _CRT_SECURE_NO_WARNINGS // fopenのエラー(C4996)対応
#pragma warning(disable : 4819) // 余計な警告が出るのでとりあえず黙らせる
#include "stdafx.h"
#include <iostream>
#include <windows.h>
// OpenCVを使用するため
#include <opencv2/opencv.hpp> // インクルードファイル指定
#include <opencv2/opencv_lib.hpp> // 静的リンクライブラリの指定
#include <cv.h>
#include <highgui.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
// QRコードをデコードをでコードするため
#include "decodeqr.h"
// OpenCVを使用するため
//#pragma comment( lib, "cv.lib" )
//#pragma comment( lib, "cxcore.lib" )
//#pragma comment( lib, "cvaux.lib" )
//#pragma comment( lib, "highgui.lib" )
// QRコードをデコードをでコードするため
#pragma comment(lib, "WS2_32.LIB")
#pragma comment(lib, "libdecodeqr.lib")
using namespace cv; // 名前空間の指定
int main()
{
CvCapture *m_pCap = 0;
IplImage *m_pImg = 0;
IplImage *qrimg = 0;
char m_cName[16];
::sprintf_s(m_cName, 16, "QRcode");
int c;
// カメラキャプチャの作成(引数はカメラデバイスの番号)
m_pCap = cvCreateCameraCapture('1');
// カメラを表示するウインドウの作成
cvNamedWindow(m_cName, CV_WINDOW_AUTOSIZE);
while (1) {
// 指定したカメラのフレーム画像を取得
m_pImg = cvQueryFrame(m_pCap);
// 指定したウインドウ内に画像を表示
cvShowImage(m_cName, m_pImg);
::Sleep(100);
// ESCキーで脱出
c = cvWaitKey(2);
if (c == '\x1b') {
break;
}
// SpaceキーでQRcode解析開始
else if (c == '\x20') {
QrDecoderHandle decoder = qr_decoder_open();
// QRコードのデコード処理
qr_decoder_set_image_buffer(decoder, m_pImg);
if (!qr_decoder_is_busy(decoder)) {
int adaptive_th_size = 25;
int adaptive_th_delta = 10;
short stat = qr_decoder_decode(decoder, adaptive_th_size, adaptive_th_delta);
for (adaptive_th_size = 25, stat = 0; (adaptive_th_size >= 3) && ((stat & QR_IMAGEREADER_DECODED) == 0); adaptive_th_size -= 2) {
stat = qr_decoder_decode(decoder, adaptive_th_size, adaptive_th_delta);
}
}
// QRコードの本文を取得
int text_size = 0;
unsigned char* text = new unsigned char[text_size];
QrCodeHeader header;
if (qr_decoder_get_header(decoder, &header)) {
if (text_size < header.byte_size + 1) {
if (text) {
delete[] text;
}
text_size = header.byte_size + 1;
text = new unsigned char[text_size];
}
qr_decoder_get_body(decoder, text, text_size);
}
std::cout << "Decoded Text = \"" << text << "\"\n";
delete[] text;
CvBox2D *boxes = qr_decoder_get_finderpattern_boxes(decoder);
CvPoint *vertexes = qr_decoder_get_coderegion_vertexes(decoder);
// 終了
qr_decoder_close(decoder);
}
}
// 開放
cvReleaseCapture(&m_pCap);
cvDestroyWindow(m_cName);
return EXIT_SUCCESS;
}
↓↓↓
再度「Ctrl+F5」を押下し、作成したアプリケーションを実行してみましょ~! もし、以下のようなエラーメッセージが出力されたら、プロジェクトのプロパティページの左側のツリーで「構成プロパティ>C/C++>コード生成」を選択します。右側の設定画面の「ランタイムライブラリ」を「マルチスレッド(/MT)」に設定します。ビルドモードにも「Release」を選択します。↓↓↓
再度「Ctrl+F5」を押下し、作成したアプリケーションを実行してみましょ~!以下の画面が表示されたら成功です! アプリケーションを起動すると、ウェブカメラが動作します。QRコードを表示させて、スペースバーを押下するとQRコードを読みます。制度はまだ低そうですね。ESCキーを押下するとアプリケーションを終了します。 ※テストアプリケーションを作成する際に以下のエラーメッセージが出力されたら、「Visual Studio 2013のVisual C++ 再配布可能パッケージ」をインストールして下さい。↓↓↓
https://www.microsoft.com/ja-jp/download/details.aspx?id=40784
※参考サイト- https://github.com/josephholsten/libdecodeqr
- http://ohwhsmm7.blog28.fc2.com/blog-entry-12.html
- http://ohwhsmm7.blog28.fc2.com/blog-entry-166.html
- http://ohwhsmm7.blog28.fc2.com/blog-entry-172.html
- http://enlosph.hatenablog.com/entry/2015/01/09/154920
- http://sourcecodebrowser.com/libdecodeqr/0.9.3/index.html