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

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

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

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

C++

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

Q&A

解決済

1回答

2145閲覧

背景差分の特定色抽出について

Cheem

総合スコア1

OpenCV

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

C++

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

0グッド

0クリップ

投稿2020/06/08 06:19

背景差分で、赤色の時のみ表示させるというプログラムを書きたいのですが、
どのように赤色だけ表示させたらいいかわかりません...
以下背景差分のプログラムは書けたのですが、赤色だけ抽出する方法を教えていただきたいです。
Visual Studioで実行しています。

c++

1#include <opencv2/opencv.hpp> 2 3using namespace std; 4using namespace cv; 5 6int main(void) { 7 8 VideoCapture camera; //cameraは映像ソースを表現するためのオブジェクト 9 camera.open(0); //映像ソースとして0番目のカメラを指定 10 //VideoCapture.camera(0);の書き方でもok 11 camera.set(CAP_PROP_FRAME_WIDTH, 384);//サイズを変えるためのもの(有でも無でも) 12 camera.set(CAP_PROP_FRAME_HEIGHT, 288);//サイズを変えるためのもの(有でも無でも) 13 14 int threshold_value = 127; 15 int opening = 0; 16 int closing = 0; 17 18 namedWindow("Slider");//"Slider"という名前のウィンドウを生成 19 resizeWindow("Slider", 600, 300);//ウィンドウのサイズ 20 //ウィンドウにスライダバーを追加する 21 createTrackbar("Threshold", "Slider", &threshold_value, 256); 22 createTrackbar("Closing", "Slider", &closing, 10); 23 createTrackbar("Opening", "Slider", &opening, 10); 24 25 Mat rgbImage, grayImage, backgroundImage, diffImage, maskImage; 26 27 while (1) { 28 29 camera >> rgbImage; 30 imshow("Color Image", rgbImage); 31 32 cvtColor(rgbImage, grayImage, CV_BGR2GRAY);//BGR画像から濃淡画像へ変換 33 imshow("Gray Image", grayImage); 34 35 //背景画像が得られているときはfalse 36 if (backgroundImage.empty() == false) { 37 38 absdiff(grayImage, backgroundImage, diffImage);//grayImageとbackgroundImageの差 39 imshow("Difference", diffImage); 40 threshold(diffImage, maskImage, (double)threshold_value, 255, THRESH_BINARY);//diffImageの画素値がthreshold_valueを超える時255,それ以下では0 41 42 dilate(maskImage, maskImage, Mat(), Point(-1, -1), closing);//膨張処理 43 erode(maskImage, maskImage, Mat(), Point(-1, -1), closing + opening);//縮小処理 44 dilate(maskImage, maskImage, Mat(), Point(-1, -1), opening);//膨張処理 45 imshow("Mask", maskImage); 46 47 Mat resultImage(rgbImage.rows, rgbImage.cols, CV_8UC3); 48 resultImage.setTo(Scalar(0, 0, 0));//resultImage全体を(0, 0, 0)に設定 49 rgbImage.copyTo(resultImage, maskImage);//maskImageをマスク画像として、rgbImageからresultImageにコピー 50 imshow("ChromaKey Image", resultImage); 51 } 52 53 int key = waitKey(1); 54 if (key == 'q') break; 55 else if (key == 's') { 56 57 grayImage.copyTo(backgroundImage); 58 imshow("Background", backgroundImage); 59 } 60 } 61 62 return 0; 63}

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

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

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

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

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

guest

回答1

0

ベストアンサー

背景差分で出てきた差分範囲に関して,現在の画像において,その範囲(全体なのか構成する各画素なのか知りませんが)が「赤いかどうか」を調べればよいのでは.

【どんな色が「赤い」に相当するのか?】というルールはあなた次第なのですし,
画像データがそこにあるのだから,好きなだけ画素値を調べればよいでしょう.

所望の色をしている領域を抜き出すのに
cv::inRangeという関数を用いる話を割と見かけますが,それ一発で済むか否かはやりたいこと次第かと.
とりあえず「cv::inRange 赤」とかで見つかるような話で使われている閾値をパクって使ってみるところから初めてみては?

投稿2020/06/10 08:55

fana

総合スコア11996

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問