2016/04/30
OpenCVで画像処理を行うのに、C#で
OpenCvSharpをよく用いています。仕事でC#を使うことが多かったのと、画像処理の条件出し(フロー検討やその各画像処理の閾値設定)を行う上でGUIがあると非常に便利で分かりやすかったからです。ただ、OpenCVは今でもC++で書いて、CUI環境で実行することが多いように思います(主観?)。ネット上の参考記事もC/C++関連が圧倒的に多いですね。
画像処理フローがすでに分かっている場合ならCUIアプリで良いと思いますが、条件出しをコード上でパラメータを微調整しながら行うのは非常に大変ですね。OpenCvSharpを用いてC#でコードを書くのも手ですが、やはりネット上で情報の多いC++で攻めて行くのが良いのではないかと最近痛感しています。C++で書いておけば、仮にOSがLinuxになろうが、OSXになろうが、コードをそのまま転用ができますからね。
とはいえ、C++に手を出すのは、今でも抵抗があるので、これから難儀しそうです。
いつもの長~い前置きはこれぐらいにして、Visual C++ 2015で簡単なWindowsフォームアプリの味見に、いざ出発です。Visual Studioを起動させ、C++で「ファイル-新規作成-プロジェクト」を選択し、新しいプロジェクトの中から「Windowsフォームアプリケーション」を探したのですが、あれっ、見当たらない・・。念のため、C#のほうで確認すると、当然ですがありました。

昔々、C++でフォームアプリを作りかけていたことがあったので、とうとうMicrosoftはC++ではフォームアプリをサポートしなくなったのかなと、勝手に思いつつ、ネットで情報を探していると、
このサイトに、Visual C++ 2012を例にフォームアプリ作成手順が書かれてありました。早速参考にさせていただきました。以下、Visual C++ 2015版の備忘録です。
1.
「ファイル-新規作成-プロジェクト」を選択し、新しいプロジェクトのVisual C++のCLRから「空のCLRプロジェクト」を選択します(プロジェクト名はデフォルトのProject1を使います)。CLRは共通言語ランタイム(Common Language Runtime)で.NETアプリを実行するためのエンジンのことですね。

OKを押した後のこの時点の状態をソリューションエクスプローラで確認すると、以下の通りです。ファイルが何も入っていない状態です。
2.
「プロジェクト-新しい項目の追加」を選択し、Visial C++のUIから「Windowsフォーム」を選択します(フォーム名はデフォルトのMyForm.hを使います)。

ここでやっとフォームが出てくるのですね。追加ボタンを押すと、参考サイトに記載の通り、以下のエラーがでましたが、無視して進みます。

この時点の状態をソリューションエクスプローラで確認すると、以下の通りです。

ソースファイル(MyForm.cpp)、ヘッダファイル(MyForm.h)の他に黄色枠に示した.NET Framework関連の情報が組み込まれました。実際にボタン等を貼り付けるのは、ヘッダファイル(MyForm.h)の方です。ヘッダファイルにGUIを実装するのは何となく違和感を感じますが、気にせずに進みます。この状態で実行させてみると、「エントリポイントを定義しなくてはなりません」と怒られてしまいました。main関数がないようです。
3.MyForm.cppにコードを追加
MyForm.cppの中身を確認すると、1行目の記述しかなかったので、以後のコードを追記しました。
#include "MyForm.h"
using namespace Project1;
[STAThreadAttribute]
int main() {
MyForm ^fm = gcnew MyForm();
fm->ShowDialog();
return 0;
}
実行すると、エラーはなくなり、フォームが表示されました。が、背景に不要な黒いWindow(コンソールウィンドウ)が表示されていました。
4.
コンソールウィンドウを消す 「プロジェクト-Project1のプロパティ」を選択し、「構成プロパティ - リンカー - システム」のサブシステムを「Windows(/SUBSYSTEM:WINDOWS)」に設定します。
この状態で実行するとエラーが出てしまうので
、、「構成プロパティ - リンカー - 詳細設定」のエントリポイントに 3.で追加したmainを記入します。
ここで実行すると、下図の通り、コンソールウィンドウも消え、無事にフォームのみが表示できました。

ここまで来れば、あとは、ボタン等をフォームに貼り付けて、個々のコーディング作業ができますね。

ボタンを押して、簡単な文字表示もできました。C#と同じようにコーディングができそうです。以上の一連の手順ですが、面倒な作業ですね。この備忘録をまとめている最中に、
「オンラインでC++用のフォームテンプレート」があることを知りました。次回はそのことについて書きたいと思います。