박민혀기

캡스톤 Face_Detection, Motor_Control 본문

Deep Learning

캡스톤 Face_Detection, Motor_Control

박민혀기 2023. 4. 4. 11:32

Face_Detection.cpp

#include <opencv2/core.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/objdetect.hpp>
#include <opencv2/imgproc.hpp>  // cv::Canny()
#include <iostream>

using namespace cv;
using namespace std;

int main(int, char**) {
	Mat frame;
	cout << "Opening camera..." << endl;
	VideoCapture capture(0); // open the first camera
	if (!capture.isOpened()){
		cerr << "ERROR: Can't initialize camera capture" << endl;
		return 1;
	}

	cout << "Frame width: " << capture.get(CAP_PROP_FRAME_WIDTH) << endl;
	cout << "     height: " << capture.get(CAP_PROP_FRAME_HEIGHT) << endl;
	cout << "Capturing FPS: " << capture.get(CAP_PROP_FPS) << endl;

	CascadeClassifier face_classifier;
	face_classifier.load("/home/ps/opencv/opencv-4.4.0/data/haarcascades/haarcascade_frontalface_default.xml");

	while(1){
		capture >> frame; // read the next frame from camera
	        if (frame.empty()){
	            cerr << "ERROR: Can't grab camera frame." << endl;
	            break;
	        }

	        flip(frame, frame, 1);

		Mat gray_frame;
		cvtColor(frame, gray_frame, COLOR_BGR2GRAY);
		equalizeHist(gray_frame, gray_frame);

		vector<Rect> faces;
		face_classifier.detectMultiScale(gray_frame, faces, 1.1, 3, 0|CASCADE_SCALE_IMAGE, Size(150, 150));

		for(size_t i = 0; i < faces.size(); i++){
			Point Face_Center = Point(faces[i].x + (faces[i].width / 2), faces[i].y + (faces[i].height / 2));

			circle(frame, Face_Center, 3, Scalar(0, 0, 255), -1);
			rectangle(frame, faces[i], Scalar(0, 255, 0), 3, 4, 0);

			break;
		}

                Point Frame_Center = Point(frame.cols / 2, frame.rows / 2);
                circle(frame, Frame_Center, 3, Scalar(255, 0, 255), -1);

		imshow("gray_frame", gray_frame);
	        imshow("frame", frame);

	        int key = waitKey(1);
	        if (key == 27/*ESC*/)
	        	break;
	}

	return 0;
}

 

Motor_Control.cpp

#include <iostream>
#include <wiringPi.h>
#include <softPwm.h>

#define	ENA	15	//ENA
#define	DIR	16	//DIR
#define	PUL	1	//PUL

using namespace std;

void setup(){
	wiringPiSetup();
  	pinMode(ENA, OUTPUT);
	pinMode(DIR, OUTPUT);
	pinMode(PUL, OUTPUT);

//	digitalWrite(ENA, LOW);
//	digitalWrite(DIR, LOW);
//	digitalWrite(PUL, LOW);
}

int main(){
	setup();
	cout << "wiring pi" << endl;

	while(1){
		for(int i = 0; i < 1000; i++){
		        digitalWrite(DIR, LOW);
		        digitalWrite(ENA, LOW);
			digitalWrite(PUL, HIGH);
			delay(1);
			digitalWrite(PUL, LOW);
			delay(1);
		}

	        for(int i = 0; i < 1000; i++){
	                digitalWrite(DIR, HIGH);
	                digitalWrite(ENA, LOW);
	                digitalWrite(PUL, HIGH);
	                delay(1);
	                digitalWrite(PUL, LOW);
       		        delay(1);
        	}
	}

        digitalWrite(ENA, LOW);
        digitalWrite(DIR, LOW);

	return 0;
}

 

OpenCV_Motor_Control.cpp

#include <opencv2/core.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/objdetect.hpp>
#include <opencv2/imgproc.hpp>  // cv::Canny()
#include <iostream>
#include <wiringPi.h>

#define	ENA	15
#define	DIR	16
#define	PUL	1

using namespace cv;
using namespace std;

void Motor_Control(int dis){
	if(dis < 0){
		dis = dis * 4;
		for(int i = 0; i > dis; i--){
			digitalWrite(DIR, LOW);
			digitalWrite(ENA, LOW);
			digitalWrite(PUL, HIGH);
			delay(1);
			digitalWrite(PUL, LOW);
			delay(1);
		}
	}
	else if(dis >= 0){
		dis = dis * 4;
		for(int i = 0; i < dis; i++){
                        digitalWrite(DIR, HIGH);
                        digitalWrite(ENA, LOW);
                        digitalWrite(PUL, HIGH);
                        delay(1);
                        digitalWrite(PUL, LOW);
                        delay(1);
		}
	}

}

int Center_Dis(Point frame_center, Point face_center){
	int center_dis = frame_center.y - face_center.y;


	return center_dis;
}

void Pin_setup(){
	wiringPiSetup();
	cout << "WiringPi Ready.." << endl;

	pinMode(ENA, OUTPUT);
        pinMode(DIR, OUTPUT);
        pinMode(PUL, OUTPUT);

	digitalWrite(ENA, LOW);
	digitalWrite(DIR, LOW);
	digitalWrite(PUL, LOW);
}

int main(int, char**) {
	Pin_setup();

	Mat frame;
	cout << "Opening camera..." << endl;
	VideoCapture capture(0); // open the first camera
	if (!capture.isOpened()){
		cerr << "ERROR: Can't initialize camera capture" << endl;
		return 1;
	}

	cout << "Frame width: " << capture.get(CAP_PROP_FRAME_WIDTH) << endl;
	cout << "     height: " << capture.get(CAP_PROP_FRAME_HEIGHT) << endl;
	cout << "Capturing FPS: " << capture.get(CAP_PROP_FPS) << endl;

	CascadeClassifier face_classifier;
	face_classifier.load("/home/ps/opencv/opencv-4.4.0/data/haarcascades/haarcascade_frontalface_default.xml");

	int dis;
	int i = 0, j = 0;
//	Max = 1000 from middle

	while(1){
		capture >> frame; // read the next frame from camera
	        if (frame.empty()){
	            cerr << "ERROR: Can't grab camera frame." << endl;
	            break;
	        }

	        flip(frame, frame, 1);

		Mat gray_frame;
		cvtColor(frame, gray_frame, COLOR_BGR2GRAY);
		equalizeHist(gray_frame, gray_frame);

		vector<Rect> faces;
		face_classifier.detectMultiScale(gray_frame, faces, 1.1, 3, 0|CASCADE_SCALE_IMAGE, Size(120, 120));

                Point Frame_Center = Point(frame.cols / 2, frame.rows / 2);
                circle(frame, Frame_Center, 3, Scalar(255, 0, 255), -1);

		if(faces.size() > 0){
			Point Face_Center = Point(faces[i].x + (faces[i].width / 2), faces[i].y + (faces[i].height / 2));
			circle(frame, Face_Center, 3, Scalar(0, 0, 255), -1);
			rectangle(frame, faces[i], Scalar(0, 255, 0), 3, 4, 0);

			if(j == 0){
				dis = Center_Dis(Frame_Center, Face_Center);
				Motor_Control(dis);

//				j++;
			}
		}

		imshow("gray_frame", gray_frame);
	        imshow("frame", frame);

	        int key = waitKey(10);
	        if (key == 27/*ESC*/)
	        	break;
	}

	Motor_Control(dis * -1);

	return 0;
}