🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

OpenCV

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

3946閲覧

【OpenCvSharp】画像内に特定の色があるかを調べる方法

smpik

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

OpenCV

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/03/24 09:12

■知りたいこと
画像の中に指定した色があるかを調べたいです。

次のようなメソッドがあったりしないでしょうか?
戻り値:指定した色があればtrue
引数 :検索対象となる画像、検索したい色

■やろうとしていること
・UnityとC#を使用
・Webカメラからの映像を取得
・取得した映像の中に、特定の色があるか判定←いまここができない
・判定結果をリアルタイムで表示

使用例は次の通りです。
・白いテーブルを上から移すようにWebカメラを配置する
・白いテーブルの上に黄色い物体を置く
・黄色い物体があるかないかをPC画面にリアルタイムで表示する

■やったこと
・OpenCVにて特定の色を検出する方法をネットで検索。
⇒InRange()を使ってマスクする方法がヒットしましたが、InRange()では指定した色が残るだけで「指定した色があったか」はわからないかなと思い、InRange()を使った方法はあきらめました。
・1画素ずつ色情報を取得
⇒At()を使って画像の1画素ずつ取得し、指定の色か判定してみましたが、処理に時間がかかり映像の更新が遅れるので、ほかにいい方法がないか探している次第です。

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

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

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

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

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

1T2R3M4

2021/03/24 09:22

countNonZeroとか使えないですか。
smpik

2021/03/24 09:47

コメントありがとうございます。 countNonZero()を使ったらやりたいことができました! 迅速な回答で、感謝です!!
guest

回答1

0

ベストアンサー

「黄色い物体」の像のサイズとしてどの程度を想定されているのかわかりませんが,
画像上で相応に面積を有することを想定できるであれば,

画像の1画素ずつ…

というのを馬鹿正直に全画素走査せずとも,適当に間引く(数画素おきに調べる)のでも十分でしょう.
あるいは,適当に縮小した画像を走査対象としても良いでしょう.

※「黄色い物体があるかないか」を調べるために走査するなら,「あった」とわかった時点で走査を打ち切ることもできます.

InRange()では指定した色が残るだけで「指定した色があったか」はわからない

に関しては,結果マスクをチェックすればよいです.
単純に,マスク画像を走査すればチェックできます(結局,走査する対象が元の絵かマスクかが変わるだけの話).
あるいは,countNonZero()みたいなのを使ってチェックすることもできるでしょう.

投稿2021/03/24 09:31

編集2021/03/24 09:33
fana

総合スコア11988

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

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

fana

2021/03/24 09:37

自前で走査して発見次第打ち切るのと,InRange()とかcountNonZero()みたいなのを使うのと,どっちが早いのか? とか,やってみると良いかと.
fana

2021/03/24 09:42

私はC#でOpenCV触ったことないのですが, 画素へのアクセスは,C++ならat()は遅いのでふつーはポインタアクセスでやります. 「OpenCvCharp 画素 アクセス」とかで検索すると,C#でのそういう話が存在する様子です.
smpik

2021/03/24 09:49

ご回答ありがとうございます。 countNonZero()を使うことでやりたいことができました! 元々やっていたAt()を使うやり方よりも処理速度が改善されました。 >画素へのアクセスは,C++ならat()は遅いのでふつーはポインタアクセスでやります. ⇒そうなんですね、教えていただきありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問