2013年6月16日日曜日

Visual C++ 2012でフォームデザイナーを使う

以前の記事でVC++2012ではフォームデザイナーが使えないとドヤ顔で申しましたが、間違いでした。
普通に使えます。

http://y-okamoto-psy1949.la.coocan.jp/booksetc/introvcpp/vs2012FormApp/

ひょっとしてMFCでも使えるのかと期待したがそんなことはなかった。
なんなんだMFC

2013年6月12日水曜日

VisualStudio2012でOpenCV2.4.5を動かす


■ダウンロード
http://sourceforge.net/projects/opencvlibrary/files/opencv-win/

(1) 2.4.5をクリック
(2) OpenCV-2.4.5.exeをクリックするとダウンロードが始まる(266MB)
(3)ダウンロード中にC:に「OpenCV2.4.5」フォルダを作成

■インストール
(1)OpenCV-2.4.5.exeをクリックし起動
(2)「...」を選択し、C:\OpenCV2.4.5フォルダを選択
(3)Extractをクリック
(4)C:\OpenCV2.4.5\opencvへインストールされる


■環境変数設定
(1)スタート→コンピュータ(右クリック)→プロパティ→設定の変更→詳細設定→環境変数
PATHへ
  C:\OpenCV2.4.5\opencv\build\x86\vc11
  C:\OpenCV2.4.5\opencv\build\x86\vc11\bin
  の二つを追加(VC11 = VisualStudio2012)

■コンパイルテスト
(1)Visual Studio2012を起動し、Win32プロジェクトで新規作成

















(2)stdafx.hに以下のコードを追加
#include <opencv2/opencv.hpp>
#include "OpenCVheader.h"
(3)プロジェクトのプロパティ→構成プロパティ→VC++ディレクトリ→インクルードディレクトリ
(4)C:\OpenCV2.4.5\opencv\build\includeを追加
(5)プロジェクトのプロパティ→構成プロパティ→VC++ディレクトリ→ライブラリディレクトリ
(6)C:\development\OpenCV2.4.2\opencv\build\x86\vc11\lib
(7)構成プロパティ→全般→共通言語ランタイムサポートを(/clr)へ変更
  (ここを忘れるとアンマネージ関数をコンパイル出来ませんと怒られる)
(8)ヘッダーファイル上で右クリックし、ヘッダーファイル(OpenCVheader.h)を新規作成。





















(9)OpenCVheader.hへ以下のコードを挿入

// バージョン取得
#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_core"            CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_highgui"        CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_imgproc"  CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_calib3d"  CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_gpu"   CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_video"   CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_objdetect"  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_ffmpeg"  CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_ts"   CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_contrib"  CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_ml"   CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_legacy"  CV_VERSION_STR CV_EXT_STR)

(10)ビルドでOK


ここまでしてアレなんですが、正直VisualStudio2010で組んだ方が楽だと思われます。
VC++2012にはフォームデザイナーが存在しない為、レイアウトの作成が非常に手間ですので。

2013年6月11日火曜日

GeForce TITANでCUDAを動かす

GeForce TITANでCUDAを動かしてみた。

Bandwidth Test

 Device 0: GeForce GTX TITAN
 Quick Mode

 Host to Device Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes)        Bandwidth(MB/s)
   33554432                     5815.1

 Device to Host Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes)        Bandwidth(MB/s)
   33554432                     6282.0

 Device to Device Bandwidth, 1 Device(s)
 PINNED Memory Transfers
   Transfer Size (Bytes)        Bandwidth(MB/s)
   33554432                     220126.1


実行性能でメモリバンド幅が約220GB/s・・・
速い・・・。

ちなみにDevice to Hostでは 6.3GB/sとえらく遅くなってるが、これはPCIe2.0x16の限界だろう。
PCIe3.0x16で単純計算で12GB/s付近までは伸びてくると思う。


うーむ、この暴力スペックで面白いアルゴリズムを動かしてみたいなぁ。

2013年6月9日日曜日

Visual Studio2012でCUDA5.0を動かす

GPGPUの環境を整える為、CUDAをインストールする。
CPUの都合により、TITANはPCIe2.0x16での動作となるが、i7 4930kの発売を待つか、Xeon E5 1650を購入するまではこの環境でテストを行う事にする。

【環境】
CPU: intel i7 3930k
GPU: nVidia GeForce TITAN
Mem: DDR3 1600 16GB
SSD: M5P 256GB
OS: Windows7 64bit
Visual Studio Professional 2012

CUDA5.0とVisualStudio2012の情報があまりにも少なすぎてインストールに半日掛かってしまった・・・。特に日本語の情報が殆ど無かった為、これから同じ環境で構築しようと考えている人の参考になるような感じで記そうと思う。

(Visual Studio 2010で構築する場合は別の情報を参照されたし。)


■事前準備
 ・nVidia グラフィックボード(最新ドライバ)
 ・Visual Studio 2012のインストール

■ダウンロード
(1) CUDA 5.0 Toolkit 32bit版のダウンロード
https://developer.nvidia.com/cuda-downloads
開発するアプリケーションによって32bitか64bitを選ぶそうだが、最初は32bitを選んだほうが無難。

■インストール
(1) ダウンロードした CUDA5.0 Toolkitを起動し、インストール。
(2) 英語表記だが全てデフォルトでOK。

//// ここから面倒 ////
(3) C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\extras\visual_studio_integration\MSBuildExtensionsに格納されているのはビルド カスタマイズファイルだが、デフォルトではVS2012に対応しない為、直接中身を弄ってやる必要がある。
.propsファイルと.targetsファイルは上書き防止の為、デスクトップにコピーし、デスクトップで編集すること。

・CUDA 5.0.props
  ↓を50行目に追加
 <CudaClVersion Condition="'$(PlatformToolset)' == 'v110'">2010</CudaClVersion>

・CUDA 5.0.targets
  Microsoftの公式では変更するように記載されているが、何故か変更しなくてもコンパイルが通る。
 この辺りがよくわからないので、もし分かる方がいらっしゃるようでしたらコメントへお願いします。
・CUDA 5.0.xml
 変更点なし。

・Nvda.Build.CudaTasks.v5.0.dll
 変更点なし。

(4)C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\V110\BuildCustomizationsへ
・CUDA 5.0.props
・CUDA 5.0.targets
・CUDA 5.0.xml
・Nvda.Build.CudaTasks.v5.0.dll
上記のファイルを放り込む。

(5)C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\includeのhost_config.hをメモ帳で開き、90行目を下記のように変更する。

#if _MSC_VER < 1400 || _MSC_VER > 1700




(6)C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\extras\visual_studio_integration\rulesにある
・NvCudaRuntimeApi.v5.0.rules
・NvCudaLinker.v5.0.rules
・NvCudaDriverApi.v5.0.rules

上記のファイルを

C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\VCProjectDefaultsへコピー

■コンパイルテスト
手順としてはCUDAのサンプルプログラムをコピーしてビルドして動かす、と簡単な内容だが、この部分に殆どの時間を要した・・・。
とりあえず、成功した手順だけ記しておく。
(1) C:\ProgramData\NVIDIA Corporation\CUDA Samples\v5.0\0_Simpleフォルダにある「template」フォルダをコピーし、「practice」へリネームする。
(2) Visual Studio 2012を起動
(3) ファイル > 開く > プロジェクトソリューションから practiceを開く。
(4) VC++コンパイラとライブラリを更新しますと出るので 「更新する」を選択。
   (カスタムビルドファイルに間違いがなければ読み取りが成功する)
(5) ソリューションを右クリックし、ビルド カスタマイズファイルでCUDA5.0を選択
  (自分の環境では複数現れた為、$(VCTargetsPath)から始まる方を選択した)
  

(5) ビルド実行
   (同様、カスタムビルドとhost_config.hの設定が間違っていなければ成功する。)
(6)エラーが発生せず、コンソールが起動すればとりあえずOK
   (Unicode 形式で保存してください。といった警報が多発しますが今回はスルー。)

書いてみれば大した内容じゃないのにこんなことに半日費やしたのが悔しいっ・・・!
とはいえ、色んなエラーに遭遇したお蔭で勉強にもなったので良しとしよう。


■おまけのトラブルシューティング
導入までに遭遇したトラブルの処置をここに記そうと思う。
.・nvcc : fatal error : '-ccbin': expected a number
 原因:カスタムビルドファイルの設定ミス(CUDA 5.0.props or CUDA 5.0.targets)
 対処:インストール手順(3) 参照

■Microsoft Visual Studio 2012 + CUDA5.0 セットアップ(スクリーンショット付き)
http://code.msdn.microsoft.com/windowsdesktop/CUDA-50-and-Visual-Studio-20e71aa1

2013年5月12日日曜日

Contec製デジタル入出力ユニットについて

さて、マシンビジョンではカメラとPCも大事だが、結果を出力するインターフェースも同じくらい重要と言える。最近ではTCP/IPを利用してイーサネット経由でPLCへの結果出力を行うことも可能ではあるが、排出制御部分のPLCがイーサネットに対応していないというケースもある。
その場合、入出力接点を利用することになるのだが、当然PCにはそんな機能は無い。
となると、市販の産業用入出力ユニットを利用するという結論に至る。

今回は市販の産業用入出力ユニットのセットアップを記しておこうと思う。

使用機材
PC: Windows7 64bit
USB 2.0ポートx1
Contec製 DIO-8/8(USB)GY
DIO-8/8(USB)GY DIO-8/8 (USB) GY 絶縁型デジタル入出力モジュール Contec

Windows7 64bitではデバイスドライバ周辺の署名関係にうるさいのは周知の通り。
この度、Contec製デジタル入出力ユニットの署名が検証できません云々で正常にドライバがインストールされなかったのでここに対処法を示す。

事前準備として、DIO-USBは接続しないこと。(デバイスドライバを入れた後なら削除しておく)
(1)ソフトウェアは通常通り付属CD-ROMでも公式サイトの最新版でもいいのでインストールする。
(2)PCを再起動し、起動時にF8を押したままにする。
(3)OS起動前に詳細ブートオプションが開く為「ドライバ署名の強制を無効にする」を選択し起動
(4)付属CD-ROMをセットし、DIO-USBを接続することで自動的にドライバインストール終了
(5)デバイスマネージャーから正常にインストールされていることを確認




今回はDIO-8/8(USB)GYでドライバが正常にインストールされなかった為、おそらくDIOシリーズ共通の症状ではないかと推測する。
まぁ、無事使用できるようになったのでよしとしよう。

OpenCV 2.4.5 インストール(windows 7 64bit)

OpenCV 2.4.5をWindows 7 64bitへインストールしてみる

CPU:i7 920
GPU: GTX295
MEM:6GB
SSD:M5P 256GB
Visual Studio 2010


■ダウンロード

(1) 2.4.5をクリック
(2) OpenCV-2.4.5.exeをクリックするとダウンロードが始まる(266MB)
(3)ダウンロード中にC:に「OpenCV2.4.5」フォルダを作成

■インストール
(1)OpenCV-2.4.5.exeをクリックし起動
(2)「...」を選択し、C:\OpenCV2.4.5フォルダを選択
(3)Extractをクリック
(4)C:\OpenCV2.4.5\opencvへインストールされる

■環境変数設定
(1)スタート→コンピュータ(右クリック)→プロパティ→設定の変更→詳細設定→環境変数
  C:\OpenCV2.4.5\opencv\build\x86\vc10
  C:\OpenCV2.4.5\opencv\build\x86\vc10\bin
  の二つを追加


■コンパイルテスト
(1)Visual C++2010を起動し、Windowsフォームアプリケーションで新規作成
(2)stdafx.hに以下のコードを追加
#include <opencv2/opencv.hpp>
#include "OpenCVheader.h"
(3)プロジェクトのプロパティ→構成プロパティ→VC++ディレクトリ→インクルードディレクトリ
(4)C:\OpenCV2.4.5\opencv\build\includeを追加
(5)プロジェクトのプロパティ→構成プロパティ→VC++ディレクトリ→ライブラリディレクトリ
(6)C:\development\OpenCV2.4.2\opencv\build\x86\vc10\lib
(7)構成プロパティ→全般→共通言語ランタイムサポートを(/clr)へ変更
  (ここを忘れるとアンマネージ関数をコンパイル出来ませんと怒られる)
(8)ビルドでOK

OpenCVheader.hの中身


// バージョン取得
#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_core"            CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_highgui"        CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_imgproc"  CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_calib3d"  CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_gpu"   CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_video"   CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_objdetect"  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_ffmpeg"  CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_ts"   CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_contrib"  CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_ml"   CV_VERSION_STR CV_EXT_STR)
//#pragma comment(lib, "opencv_legacy"  CV_VERSION_STR CV_EXT_STR)