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

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

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

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

C++

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

Q&A

解決済

1回答

2873閲覧

二色以上の色を同時に認識したい

asce

総合スコア7

OpenCV

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

C++

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

0グッド

0クリップ

投稿2017/01/09 03:25

編集2017/01/09 04:42

###前提・実現したいこと
visual studio2015でopencvを使い、信号機を認識したいと思っています。
赤一色は認識できたが、赤と同時に信号機の輪郭の灰色も認識したいです。

###発生している問題・エラーメッセージ
サンプルコードを利用し、赤と青を認識するものはできたが実行結果が二つに分かれてしまう。この色の認識を青から灰色に変更し、同時に結果を表示できるのが理想です。

エラーメッセージ

###該当のソースコード
C++
#include "stdio.h"
#include <opencv2/opencv.hpp>

using namespace cv;

int main()
{
Mat image_src = imread("toilet.jpg");
namedWindow("原画像");
imshow("原画像", image_src);

Mat image_hsv; cvtColor(image_src, image_hsv, COLOR_BGR2HSV); Mat channels[3]; split(image_hsv, channels); int width = image_src.cols; int height = image_src.rows; Mat image_red = Mat(Size(width, height), CV_8UC1); Mat image_blue = Mat(Size(width, height), CV_8UC1); uchar hue, sat; for (int y = 0; y < height; y++) for (int x = 0; x < width; x++) { hue = channels[0].at<uchar>(y, x); sat = channels[1].at<uchar>(y, x); if ((hue < 8 || hue > 168) && sat > 100) image_red.at<uchar>(y, x) = 0; else image_red.at<uchar>(y, x) = 255; if ((hue > 97 && hue < 117) && sat > 100) image_blue.at<uchar>(y, x) = 0; else image_blue.at<uchar>(y, x) = 255; } namedWindow("赤検出画像"); imshow("赤検出画像", image_red); namedWindow("青検出画像"); imshow("青検出画像", image_blue); waitKey(0); destroyAllWindows(); return 0;

}

###試したこと
namadWindowを1つにすれば結果は1つになるのではないかと考え、消してみたが、結果は一色のみの結果が表示されるというものでした。

###補足情報(言語/FW/ツール等のバージョンなど)
C++
visual studio2015
opencv2.4

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

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

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

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

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

yohhoy

2017/01/09 10:13 編集

「実行結果が二つに分かれてしまう」「namadWindowを1つにすれば結果は1つになるのでは」とありますが、赤色領域と青色領域の検出結果を1枚の画像に合成したいということですか?また「この色の認識を青から灰色に変更し、同時に結果を表示〜」の趣旨が不明瞭です。対象画像の中で新たに灰色領域を認識したい(つまり赤+青+灰色の3領域を検出したい)のでしょうか?
yumetodo

2017/01/09 12:53

というより提示されているコードを見る限り(synatxhighlishtしてください)謎が深まりますね・・・。赤と青の検出と言いながらどういうわけかHSV色空間に変換していますし・・・。灰色の定義はどうするんですかね・・・
guest

回答1

0

ベストアンサー

C++

1if ((hue < 8 || hue > 168) && sat > 100) 2 image_red.at<uchar>(y, x) = 0; 3else 4 image_red.at<uchar>(y, x) = 255; 5 6if ((hue > 97 && hue < 117) && sat > 100) 7 image_blue.at<uchar>(y, x) = 0; 8else 9 image_blue.at<uchar>(y, x) = 255; 10

この部分、image_red と image_blue にそれぞれ値を書き込んでいるので、それは結果は二つになるでしょう。
どちらかのワークにしきい値によって違う値を書き込むようにすればいいのではないでしょうか。

投稿2017/01/28 19:39

mugicya

総合スコア1046

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問