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

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

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

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

216閲覧

Python版OpenCVでの行列操作をC++版で行いたい

maskey

総合スコア14

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/03/27 23:39

編集2019/03/28 09:22

Python版OpenCVの機能をC++に移植しているのですが、以下のPythonコードをC++版のOpenCVでどのように書けば良いのかわからなくなりました。一行で書けなくても結構ですので、どなたか助けて頂けると幸いです。
imgA,B,Cはそれぞれfloat型1チャンネル画像(numpyの2darray)です。

imgA[imgB > 0] = imgC[imgB > 0]

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

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

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

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

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

stdio

2019/03/28 04:58

imgA[imgB > 0] = imgC[imgC > 0] とはC++の計算式では、 imgA[0or1] = imgC[0or1]; となるので、imgのA,B,Cを配列だと仮定するならかなり難しい事になりますね。 まず、imgのA,B,Cは配列なのか、リストなのか文面から分かりません。この辺を定義して下さるとアドバイスしやすくなりますよ。
tiitoi

2019/03/28 09:11

C++ に移植する以前に numpy でもこのような演算はできないはずですよ。 imgA.shape = imgB.shape = imgC.shape で imgA[imgB > 0] = imgC[imgB > 0] ならわかりますが、 imgA[imgB > 0] = imgC[imgC > 0] だと、imgB > 0 が True の要素と imgC > 0 が True の要素が一致するとは限らないのでこのような代入はできません。
stdio

2019/03/28 09:23

imgC[imgC > 0]は、 まぁ、ただの誤字じゃない?
maskey

2019/03/28 09:24

ご指摘の通りimgC[imgB>0]の誤りでした。修正致しました。
yominet

2019/03/28 14:42

最初 imgA[(imgB>0)&(imgC>0)] = imgC[(imgB>0)&(imgC>0)] こうしたいのかと思いました
guest

回答2

0

どうやら配列のようですのでお答えいたします。
結論から言ってその記載方法では出来ません。
この様にしてみてはいかがでしょうか?

C++

1void img(int count1,int count2){ 2 if(count1 < 0) count1 = 0; 3 if(count2 < 0) count2 = 0; 4 imgA[count1] = imgC[count2]; 5} 6 7img(imgB.length,imgB.length);

投稿2019/03/28 09:20

編集2019/03/28 09:24
stdio

総合スコア3307

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

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

0

ベストアンサー

cv::Mat::copyTo() をお使いください。

cpp

1void cv::Mat::copyTo(OutputArray m, InputArray mask) const
  • m: Destination matrix. If it does not have a proper size or type before the operation, it is reallocated.
  • mask: Operation mask of the same size as *this. Its non-zero elements indicate which matrix elements need to be copied. The mask has to be of type CV_8U and can have 1 or multiple channels.

cpp

1#include <iostream> 2 3#include <opencv2/opencv.hpp> 4 5 6int main() 7{ 8 // mat1[mat3 > 0] = mat2[mat3 > 0] と以下は同じ 9 10 cv::Mat mat1 = (cv::Mat_<float>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9); 11 std::cout << mat1 << std::endl; 12 // [1, 2, 3; 13 // 4, 5, 6; 14 // 7, 8, 9] 15 16 cv::Mat mat2 = 17 (cv::Mat_<float>(3, 3) << 11, 12, 13, 14, 15, 16, 17, 18, 19); 18 std::cout << mat2 << std::endl; 19 // [11, 12, 13; 20 // 14, 15, 16; 21 // 17, 18, 19] 22 23 cv::Mat mat3 = (cv::Mat_<float>(3, 3) << -1, -1, 1, -1, -1, -1, 1, -1, 1); 24 std::cout << mat3 << std::endl; 25 // [-1, -1, 1; 26 // -1, -1, -1; 27 // 1, -1, 1] 28 29 // mat3 > 0 の要素のみ mat2 の値を mat1 にコピーする。 30 mat2.copyTo(mat1, mat3 > 0); 31 std::cout << mat1 << std::endl; 32 // [1, 2, 13; 33 // 4, 5, 6; 34 // 17, 8, 19] 35} 36

投稿2019/03/28 09:38

tiitoi

総合スコア21956

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

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

maskey

2019/03/28 21:48

ありがとうございます。望んだ様に動きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問