박민혀기

CELLON Kart HSV detect Source Code 본문

CELLON Kart(Tracking)/Source Code

CELLON Kart HSV detect Source Code

박민혀기 2023. 7. 12. 11:17
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

Mat frame;

void HSV_Process(Scalar lowerHSV, Scalar upperHSV) {
	Mat hsv_frame, mask, result;
	cvtColor(frame, hsv_frame, COLOR_BGR2HSV);
	inRange(hsv_frame, lowerHSV, upperHSV, mask);
	//bitwise_and(frame, frame, result, mask);

	vector<vector<Point>> contours;
	findContours(mask, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

	double maxArea = 0;
	int maxAreaIdx = -1;

	// 각 외곽선의 면적 비교
	for (size_t i = 0; i < contours.size(); i++) {
		double area = contourArea(contours[i]);
		if (area > maxArea) {
			maxArea = area;
			maxAreaIdx = static_cast<int>(i);
		}
	}
	if (maxAreaIdx != -1) {
		Rect boundRect = boundingRect(contours[maxAreaIdx]);

		drawContours(frame, contours, maxAreaIdx, cv::Scalar(0, 255, 255), 1);
		rectangle(frame, boundRect, Scalar(0, 255, 0), 2);
	}

	imshow("mask", mask);
}

Scalar Push_Button(Rect2i roi_point) {
	Mat hsv_frame;
	hsv_frame = frame(roi_point).clone();
	cvtColor(hsv_frame, hsv_frame, COLOR_BGR2HSV);

	imshow("hsv_frame", hsv_frame);

	return mean(hsv_frame);
}

int main() {
	VideoCapture cap = VideoCapture(0);
	if (!cap.isOpened()) {
		cout << "Could't load camera" << endl;
		return -1;
	}

	double width = cap.get(CAP_PROP_FRAME_WIDTH);
	double height = cap.get(CAP_PROP_FRAME_HEIGHT);
	//cap.set(CAP_PROP_FRAME_WIDTH, width);
	//cap.set(CAP_PROP_FRAME_HEIGHT, height);
	namedWindow("frame");

	int key;
	Scalar meanHSV = Scalar(0, 0, 0);
	Scalar dis_HSV = Scalar(40, 40, 40);
	Scalar lowerHSV, upperHSV;
	Rect2i roi_frame = Rect(Point(width / 5 * 2, height / 10 * 2), Point(width / 5 * 3, height / 10 * 8));

	while (1) {
		cap >> frame;
		flip(frame, frame, 1);
		if (frame.empty()) {
			cout << "Could't load frame" << endl;
			return -1;
		}

				//Raspberry Camera Mode//
		//Mat gaussian_blur;
		//GaussianBlur(frame, gaussian_blur, Size(9, 9), 5);
		//Mat sharpened = frame - gaussian_blur;
		//Mat result = frame + sharpened;

		key = waitKey(1);
		if (key == 27)	break;
		else if (key == 32) {
			meanHSV = Push_Button(roi_frame);
			lowerHSV = meanHSV - dis_HSV;
			upperHSV = meanHSV + dis_HSV;
		}
		else if (key == 65)	meanHSV = 0;

		if (meanHSV[0] != 0 || meanHSV[1] != 0 || meanHSV[2] != 0) {
			HSV_Process(lowerHSV, upperHSV);
		}

		rectangle(frame, roi_frame, Scalar(0, 0, 255), 2, 8);
		imshow("frame", frame);
	}

	cap.release();
	destroyAllWindows();

	return 0;
}