背景差分と特定色抽出

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
chem

背景差分と特定色抽出

#1

投稿記事 by chem » 3年前

背景差分と特定色抽出を使用し、赤色検出した場合文字を出すというプログラム(赤色検出した場合アラームのような音を鳴らすが理想ですが...)を書きたいのですが、
赤色検出した場合の判断をどのようにすればいいかわかりません。
現在書いているプログラムは下記のようなものになります。

コード:

#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(void) {

	VideoCapture camera;//cameraは映像ソースを表現するためのオブジェクト
	camera.open(0);//映像ソースとして0番目のカメラを指定
	camera.set(CAP_PROP_FRAME_WIDTH, 384);//サイズ(幅)を変えるためのもの
	camera.set(CAP_PROP_FRAME_HEIGHT, 288);//サイズ(高さ)を変えるためのもの

	//初期値の設定
	int hueMin = 150;
	int hueMax = 179;
	int satMin = 64;
	int satMax = 255;
	int valMin = 0;
	int valMax = 255;

	//二値化処理
	int threshold_value = 127;
	//クロージング・オープニング処理
	int opening = 0;
	int closing = 0;

	namedWindow("Slider");//"Slider"という名前のウィンドウを生成
	resizeWindow("Slider", 600, 400);//ウィンドウのサイズ
	//ウィンドウにスライダバーの追加
	createTrackbar("Threshold", "Slider", &threshold_value, 256);
	createTrackbar("Closing", "Slider", &closing, 10);
	createTrackbar("Opening", "Slider", &opening, 10);

	Mat rgbImage, grayImage, hsvImage, maskImage, backgroundImage, diffImage;


	while (1) {

		//Mat rgbImage, grayImage, hsvImage, maskImage, backgroundImage, diffImage;

		camera >> rgbImage;
		imshow("Color Image", rgbImage);

		cvtColor(rgbImage, hsvImage, CV_BGR2HSV);//入力画像の色表現を変換する
		inRange(hsvImage, Scalar(hueMin, satMin, valMin), Scalar(hueMax, satMax, valMax), maskImage);//入力画像の各画素値が指定された範囲内にあるかどうかを判定

		cvtColor(rgbImage, grayImage, CV_BGR2GRAY);//BGR画像から濃淡画像へ変換
		imshow("Gray Image", grayImage);

		//背景画像が得られているときはfalse
		if (backgroundImage.empty() == false) {

			absdiff(grayImage, backgroundImage, diffImage);//grayImageとbackgroundImageの差
			imshow("Difference", diffImage);
			threshold(diffImage, maskImage, (double)threshold_value, 255, THRESH_BINARY);//diffImageの画素値がthreshold_valueを超える時255,それ以下では0

			dilate(maskImage, maskImage, Mat(), Point(-1, -1), closing);//膨張処理
			erode(maskImage, maskImage, Mat(), Point(-1, -1), closing + opening);//縮小処理
			dilate(maskImage, maskImage, Mat(), Point(-1, -1), opening);//膨張処理
			imshow("Mask", maskImage);

			Mat resultImage(rgbImage.rows,rgbImage.cols, CV_8UC3);
			resultImage.setTo(Scalar(0, 0, 0));//resultImage全体を(0, 0, 0)に設定
			rgbImage.copyTo(resultImage, maskImage);//maskImageをマスク画像として、rgbImageからresultImageにコピー
			imshow("ChromaKey Image", resultImage);
		}
		

		int key = waitKey(1);
		if (key == 'q') break;
		else if (key == 's') {

			grayImage.copyTo(backgroundImage);
			imshow("Background", backgroundImage);
		}
	}

	return 0;
}

“C言語何でも質問掲示板” へ戻る