番外:OpenCvSharpを使わないで 直接Vc++からOpenCvを使ってみました

ここまで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
スポンサーリンク
Rectangle大広告
Rectangle大広告

シェアする

  • このエントリーをはてなブックマークに追加

フォローする