質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

3回答

3341閲覧

【C++】の処理を【C++/CLI】で処理を行いたい

cayman

総合スコア10

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2019/02/15 05:23

前提・実現したいこと

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/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/02/15 06:09

> 両方ともエラーなく処理はできています。 とすると何が問題なのでしょう?
stdio

2019/02/15 06:30

うむ、質問の意図がさっぱり分からん。
cayman

2019/02/15 07:19

すみません。 それぞれでエラーなく処理はできていますがC++の処理できているものをC++/CLIに組み込んでC++/CLIで処理させたいのです。
退会済みユーザー

退会済みユーザー

2019/02/15 08:29 編集

OpenCV は C++ で、それを組み込む Windows Forms アプリを C++/CLI でというのが現状だと理解していますが、それで良いのでは? ( https://www.buildinsider.net/small/opencv/001 の「2.3 サポート言語」参照)
cayman

2019/02/15 08:32

連絡頂けると幸いです。 bus556dax@gmail.com
wwbQzhMkhhgEmhU

2019/02/16 01:18

横槍入れてすみませんね。メールだと他の人に伝わらないし、記録を残す意味もなくなるので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++側からマネージドコードを呼び出すことも出来るかもしれません。調べたことないですけど。
wwbQzhMkhhgEmhU

2019/02/16 01:35

今見たらOpenCvSharpも一応開発続いてるっぽいですよ。 多分最初はこれ使うのがいいのではないでしょうか?
cayman

2019/02/18 06:13

すみません。素人なので考え方がわかりません。 C++のコードの部分をC#の書きかたに直し、CLIに書き込むということは可能でしょうか?
wwbQzhMkhhgEmhU

2019/02/18 06:29

とりあえず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#は使えないのです?
hihijiji

2019/02/19 09:56

C++/CLIはMSに何度か見捨てられそうになったり、挙動が特殊だったりと問題が多いのでお勧めしません。 C++/CLIはエキスパートもしくはエンスー向けです。
guest

回答3

0

C++の何かしらをC++/CLIから呼び出したいのであれば、以下の記事が参考になると思います。

[連載! とことん VC++] 第 9 回 C++/CLI を利用した相互運用 ~.NET からのネイティブ C++ 資産の再利用~
https://code.msdn.microsoft.com/windowsdesktop/VisualC-a1dc1f1d

聞かれても細かい事は判りませんが(^^;

投稿2019/02/15 06:43

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

C++/CLIを使ったことはないのですが、C++の上位互換と聞いています。
ですので、C++のコードは原則として C++/CLIでもコンパイルできる筈です。

しかし、OpenCVはアセンブラ等も多用していました(最近のは知りませんが)。C++/CLIは恐らくアセンブラまではサポートしていませんから、OpenCVをC++/CLIでビルドすることはできない筈です。
従って、問題はC++でビルドされたOpenCVの外部ライブラリとC++/CLIとのリンクの問題と思います。
takabosoftさんが回答されているリンク先が妥当っぽいです。

teratailにはこの辺に詳しい方もいらっしゃいますので、しばらく待てばもう少し的確な回答がつくかも知れません。

投稿2019/02/15 13:14

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

既出ですが、C++ と C++/CLI を連携させたいのであれば、以下の記事を参照してください。

[連載! とことん VC++] 第 9 回 C++/CLI を利用した相互運用 ~.NET からのネイティブ C++ 資産の再利用~


C++/CLI は名前に「C++」と付いていますが、C++ の上位版というよりは C++ に似せた別の言語だと思った方が良いです。

複数の言語を組み合わせた開発は複雑になるので、OpenCV を使った Windows アプリケーションを作りたいのであれば、 以下の組み合わせのどちらかをおすすめします。

  • C#(Windows Forms or WPF) と OpenCVSharp の組み合わせ
  • C++ と OpenCV の組み合わせ

C++(C++/CLI ではなく)でも QtGTK+ のような GUI ライブラリを使えば簡単に GUI を作れると思います。

投稿2019/02/23 04:23

nskydiving

総合スコア6500

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問