前提・実現したいこと
C++プログラミング初心者です。
現在参考書をみながらVisualStudio2015でOpenCVを用いて画像処理できる簡単なアプリケーションの作成を行っています。
その際に見栄えを良くしようと考えUIとしてForm作成が可能なC++/CLIで作成を行いました。
ここで実現したい処理についてwebに記載されている通り通常のC++を使って別のプロジェクトより
作成を行いました。C++で記載したコードをそのままフォームを作成したC++/CLIの方に組み込みたいと考えていましたが調べた所C++とC++/CLIはコードの書きかたが違うことに気が付きました。どのようにどこを変更すればよいのでしょうか。
両方ともエラーなく処理はできています。
発生している問題・エラーメッセージ
該当のソースコード
まず実装させたい【C++/CLI】のコードの場所を記します。casw 0:に【C++】で記載した処理を実装したいと考えています。 【C++/CLI】 private: System::Void bEffect2_Click(System::Object^ sender, System::EventArgs^ e) { if (mOrgImg.empty()) return; switch (comboBox2->SelectedIndex) { case 0: break; } pictureBox2->Image = mat2bmp(mDspImg); } 【C++】 void DrawImage::process(void) { cv::Mat hsvImg; cvtColor(im_ABCDE, hsvImg, CV_BGR2HSV, 3); cv::Scalar s_min = cv::Scalar(30, 0, 250); cv::Scalar s_max = cv::Scalar(71, 255, 255); cv::inRange(hsvImg, s_min, s_max, proc_ABCDE); int pixels = 0; int white = 0; int width = proc_ABCDE.cols; int height = proc_ABCDE.rows; for (int y = 0; y < height; y++) { int step = y*width; for (int x = 0; x < proc_ABCDE.cols; x++) { int elm = x*proc_ABCDE.elemSize(); if (proc_ABCDE.data[step + elm]>0){ white++; } pixels++; } } double result = ((double)white / pixels) * 100; printf("黒の領域:%d 白の領域:%d\n",pixels ,white); printf("割合:%.5f%\n",result); } //メインプログラム int main(int argc, char* argv[]) { //インスタンスの生成と画像の取得 DrawImage dw("BBB.jpg"); //もしデータが入力されていなければ何もしないで終了 if (dw.available == -1) { return 0; } else { dw.process(); dw.showImage(); } return 0; } //表示を行うためのメンバ関数 void DrawImage::showImage(void) { cv::imshow("showimage", proc_ABCDE); cv::waitKey(0); //入力待機 }
試したこと
補足情報(FW/ツールのバージョンなど)
> 両方ともエラーなく処理はできています。
とすると何が問題なのでしょう?
うむ、質問の意図がさっぱり分からん。
すみません。
それぞれでエラーなく処理はできていますがC++の処理できているものをC++/CLIに組み込んでC++/CLIで処理させたいのです。
OpenCV は C++ で、それを組み込む Windows Forms アプリを C++/CLI でというのが現状だと理解していますが、それで良いのでは? ( https://www.buildinsider.net/small/opencv/001 の「2.3 サポート言語」参照)
連絡頂けると幸いです。
bus556dax@gmail.com
横槍入れてすみませんね。メールだと他の人に伝わらないし、記録を残す意味もなくなるのでNGです。
私はJavaがC/C++からJVMを操作できる(プロセスとしてはC/C++だけどJVMを中で起動できる)ように、C/C++からManagedコードを呼び出せるかどうかは知りません。
現状コンソールからMain関数を書いていて、そこからWindowsFormなどのWindowを表示したことがあるか?と言われたらないのです(C#のコンソールアプリなら普通に出来ますが)。Windowsフォームアプリを作成して、そこからC/C++を呼び出したことはあるので、それなら可能ですよ。
その場合は、PInvokeを使うのが一般的だと思いますが、無理とか速度的に難しい場合はC++/CLIで自分でピン留めしたりマーシャリングしたりする、という形になるかと思います。
結論としては、アプリとしてはC#で書いちゃえばいいんじゃないでしょうか?
C++/CLIはマネージドの皮を持たせたマネージ/アンマネージドコード混在のライブラリとして作成して、C#から呼び出す形で使う感じになるかと思います。ただ、OpenCVならPInvokeで呼べちゃいそうな気もします。その場合は、自作部分はC#だけで書けると思います。
なお、最初に書いたようにC++側からマネージドコードを呼び出すことも出来るかもしれません。調べたことないですけど。
今見たらOpenCvSharpも一応開発続いてるっぽいですよ。
多分最初はこれ使うのがいいのではないでしょうか?
すみません。素人なので考え方がわかりません。
C++のコードの部分をC#の書きかたに直し、CLIに書き込むということは可能でしょうか?
とりあえずC++で使用している関数をOpenCVSharpのドキュメントで検索しました。
https://shimat.github.io/opencvsharp_docs/html/83c0eb24-b0ca-9b3a-2f19-82b28ad9ec6d.htm
https://shimat.github.io/opencvsharp_docs/html/2d2f3037-96f8-85ce-f2ad-479db60ea493.htm
あるみたいなので、C#で記述することは可能な気がします。
OpenCVSharpを使うなら、C++とC++/CLIのコードは使いません。
今全体をチラ見しましたが、これなんでC++だけで書かずに、C++/CLIを使いたかったんですか?
あとC#は使えないのです?
C++/CLIはMSに何度か見捨てられそうになったり、挙動が特殊だったりと問題が多いのでお勧めしません。
C++/CLIはエキスパートもしくはエンスー向けです。