#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;
}