ここまでOpenCvSharpを使っていろいろ画像処理を進めてきましたが Windowsアプリを作成するのに Vc++から直接使ってもさほど大きな違いがなさそうな予感がしたので 実験的に ネガポジ変換プログラムを作成してみました。参考にしたサイトは OpenCvをインストールするときお世話になったここと ここです。
両方の サイトを見ればできちゃうよ との 突込みがありそうですが 自分の備忘録のため残しておきます。また自分自身あまりVc++に強くは無いので誤っている箇所もあるかも知れませんが よろしくお願いします。
動作環境は Win7・Ms VisualStudio2008 そして OpenCv2.4です。(Vs2010 Expressでも実験してみましたが インテリセンスがうまくいかないのでVs2008で進めています)
1.プロジェクトを作成する。
- Vs2008を起動し ファイルメニューから 新規作成 ⇒プロジェクトをクリックします。
- 新しいプロジェクトのダイアログで Visual C++のWindowsフォームアプリケーションを選択しOK
この際プロジェクト名・格納場所などを指定します。ここでは プロジェクト名を OpenCvCppとしました。
2.プロジェクトのプロパティを設定する。
- ファイルメニューから プロジェクト⇒プロパティ をクリックします。
- プロジェクトのプロパティのダイアログで
「構成プロパティ」→「全般」で 共通ランタイム サポートを変更します。
純粋MSIL共通言語ランタイム(/clr:pure) ⇒ 共通言語ランタイム(/clr) 構成プロパティのC/C++をクリックし 追加のインクルードディレクトリ欄に OpenCvのbuildフォルダのincludeフォルダのフルパスを入力します。
自分の場合はC:opencvbuildincludeでした。
3.OpenCvCpp.cppを変更する。(ファイル名はプロジェクト名.cpp となります)
OpenCvCpp.cppを開き #include “stdafx.h” の下に 以下の内容を追加します。
#include “opencv2opencv.hpp”
#ifdef _DEBUG
//Debugモードの場合
#pragma comment(lib,”C:¥opencv¥build¥x86¥vc9¥lib¥opencv_core240d.lib”)
#pragma comment(lib,”C:¥opencv¥build¥x86¥vc9¥lib¥opencv_imgproc240d.lib”)
#pragma comment(lib,”C:¥opencv¥build¥x86¥vc9¥lib¥opencv_highgui240d.lib”)
#pragma comment(lib,”C:¥opencv¥build¥x86¥vc9¥lib¥opencv_objdetect240d.lib”)
#pragma comment(lib,”C:¥opencv¥build¥x86¥vc9¥lib¥opencv_contrib240d.lib”)
#pragma comment(lib,”C:¥opencv¥build¥x86¥vc9¥lib¥opencv_features2d240d.lib”)
#pragma comment(lib,”C:¥opencv¥build¥x86¥vc9¥lib¥opencv_flann240d.lib”)
#pragma comment(lib,”C:¥opencv¥build¥x86¥vc9¥lib¥opencv_gpu240d.lib”)
#pragma comment(lib,”C:¥opencv¥build¥x86¥vc9¥lib¥opencv_haartraining_engined.lib”)
#pragma comment(lib,”C:¥opencv¥build¥x86¥vc9¥lib¥opencv_legacy240d.lib”)
#pragma comment(lib,”C:¥opencv¥build¥x86¥vc9¥lib¥opencv_ts240d.lib”)
#pragma comment(lib,”C:¥opencv¥build¥x86¥vc9¥lib¥opencv_video240d.lib”)
#else
//Releaseモードの場合
#pragma comment(lib,”C:¥opencv¥build¥x86¥vc9¥lib¥opencv_core240.lib”)
#pragma comment(lib,”C:¥opencv¥build¥x86¥vc9¥lib¥opencv_imgproc240.lib”)
#pragma comment(lib,”C:¥opencv¥build¥x86¥vc9¥lib¥opencv_highgui240.lib”)
#pragma comment(lib,”C:¥opencv¥build¥x86¥vc9¥lib¥opencv_objdetect240.lib”)
#pragma comment(lib,”C:¥opencv¥build¥x86¥vc9¥lib¥opencv_contrib240.lib”)
#pragma comment(lib,”C:¥opencv¥build¥x86¥vc9¥lib¥opencv_features2d240.lib”)
#pragma comment(lib,”C:¥opencv¥build¥x86¥vc9¥lib¥opencv_flann240.lib”)
#pragma comment(lib,”C:¥opencv¥build¥x86¥vc9¥lib¥opencv_gpu240.lib”)
#pragma comment(lib,”C:¥opencv¥build¥x86¥vc9¥lib¥opencv_haartraining_engined.lib”)
#pragma comment(lib,”C:¥opencv¥build¥x86¥vc9¥lib¥opencv_legacy240.lib”)
#pragma comment(lib,”C:¥opencv¥build¥x86¥vc9¥lib¥opencv_ts240.lib”)
#pragma comment(lib,”C:¥opencv¥build¥x86¥vc9¥lib¥opencv_video240.lib”)
#endif
なお ここで
C:¥opencvはOpenCvをインストールしたパス
X86は 32ビット版・64ビット版のどちらをインストールしたかを示し 32ビット版ならX86 64ビット版ならX64
vc9は vs2008用を示し vs2010ならvc10となります。
******240.lib の240はOpenCvのバージョンを示します。
3.画面のデザイン
ソリューションエクスプローラーで Form1を選択し 表示メニューからデザイナをクリックします。
フォームのデザイン画面で次のコントロールを追加します。
ピクチャボックス・ネガポジ変換ボタン・初期処理用タイマー
4.コーディング
ソリューションエクスプローラーで Form1を選択し 表示メニューからコードをクリックします。
ソース部分を以下のように変更します。太字部分が 挿入した部分です。
#pragma once
namespace OpenCvCpp {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
int flag;
IplImage* img;
///
中略
///
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
//
//TODO: ここにコンストラクタ コードを追加します
//
flag = 0;
}
protected:
///
中略
#pragma endregion
private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) {
img = cvLoadImage(“C:¥¥OpenCvTest¥¥Data¥¥ai2.jpg”,CV_LOAD_IMAGE_COLOR);
flag = 1;
pictureBox1->Invalidate();
}
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
cvNot(img, img);
pictureBox1->Invalidate();
}
private: System::Void pictureBox1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) {
if (flag == 1) {
Bitmap^ bmp = gcnew Bitmap(img->width, img->height, img->widthStep,
System::Drawing::Imaging::PixelFormat::Format24bppRgb, IntPtr(img->imageData));
//Graphicsクラスの作成
Graphics^ g = e->Graphics;
// 画像の描画
g->DrawImage(bmp, 0, 0, img->width, img->height);
pictureBox1->Refresh();
}
}
};
}
以上で C#およびOpenCvSharpを用いた処理と同じ結果が得られました。
Windows7 Vs2008(C++) OpenCv2.4 |