aaaa さんが書きました:
また、私は信号の色を判断したいと考えています。
画像は限りなく信号機のみを写している画像を使う予定なので、画像は「上半分が赤で下半分が黒」、「上半分が黒、下半分が青」というような画像のつもりです。
追記ありがとうございました。なるほど信号機でしたか。
そういうことであれば、背景やら信号機の灯火以外の余計な部分は一旦考えないものとして、
与えられた画像の赤成分、青成分を数えて多い方をその画像の色だと判定してもよいかもですね。
(赤と青が同時に点灯することはないものとして)
その場合だとフラグ方式よりも、赤と青の各成分量(ピクセル数)をカウントするようにした方がよいのかもです。
いずれにせよ判別方法がまとまるのをお待ちします(*´ヮ`)
…と書いていたら追記があったのでそちらにも返信します。
aaaa さんが書きました:
しかし、こちらはこのようなエラーが出てしまいました。
コード:
redbluedetect.cpp:55:4: error: ‘else’ without a previous ‘if’
else
^
提示されているプログラムのif文を見るとブロック{}で囲まれていないため、
判定分の直後の処理は1文しか書けない状態になっています。
それにもかかわらずif文の後に複数の文を書いた後でelse節を書いたために、
「elseに対応するifが見つからないよ!」とエラーを出されています。
当該部分だけを抜き出すと以下の部分です。
if((hue<10 || hue>170) && sat>45) の後にflag_red=1;が追記されたために、
if文がtrueだった時に処理する内容が複数の文になってしまいました。
{}で囲わない場合にはifやelseの後には1文しか書けないので、
エラーになっているものと思います。
aaaa さんが書きました:
コード:
/*red_detect*/
if((hue<10 || hue>170) && sat>45)
red_image.at<uchar>(y, x) = 0;
flag_red = 1;
else
red_image.at<uchar>(y, x) = 255;
ですので解決策としては以下のようにifやelseの処理部分を{}で囲んでブロックにしてあげるとよいかと思います。
コード:
/*red_detect*/
if((hue<10 || hue>170) && sat>45)
{
red_image.at<uchar>(y, x) = 0;
flag_red = 1;
}
else
red_image.at<uchar>(y, x) = 255;
これで期待した動きになったでしょうか?
不明な点があれば遠慮なく聞いてくださいね(*´ヮ`)
aaaa さんが書きました:
このプログラムでも、赤じゃないから青です。
とは言えそうなのですが、できれば赤だから赤と言わせたいです。
確かに消去法で「赤じゃないから青」と判定してしまうと、
「黄色信号」の場合や「停電で赤も青も消灯している信号」に確実に誤判定しますので、間違いなく赤だ(or青だ)という判定にしたいですよね。