CELLON Vision

비전 검사기 Model ALAM-A(N-Com) 소스코드, 실행 파일

박민혀기 2022. 9. 7. 00:26

구현 환경

1. RaspberryPi CM4

2. OpenCV4.5.1

3. (카메라 모델, 재료 등)

 

ALAM 비전 검사기 Model ALAM-A(N-Com) 소스 코드

Camera 촬영 검사

Auto Resolution : 640x480

// flag define 처리		=>	OK
//Center Marking		=>	OK
//일치도 트랙바 조절		=>	OK
//키 입력시 촬영			=>	OK
//해상도 변경시			=>	Compare_State, Compare_Result, State_Message 좌표 값 변경
//Text Background 설정	=> OK
//ENTER_SETTING_MODE에서 ROI지정 풀림 => OK
//State Message UpLoad	=> OK

//블랙 바 검출 project	=> 동일

//여러가지 ROI 지정 가능	=> ING
//Raspberry 포팅			=> NEXT
//TXT FILE 저장				=> 파일이 없을시 디폴트 실행, 있을시 읽어서 실행
//내구성 테스트

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <iostream>
#include <time.h>
#include "opencv2/opencv.hpp"

#define TEST_VIDEO_1920P	"C:\\Users\\xlfks\\Downloads\\COSTA RICA IN 4K 60fps HDR (ULTRA HD).mp4"
#define TEST_VIDEO			"C:\\opencv\\sources\\samples\\data\\vtest.avi"		//768x576		=>		-128x96
#define WEB_CAM				0													//PC Default : 640x480,		Ubuntu Default : 1280x720


//remove
#define START_MODE			"START_MODE"
#define ENTER_SETTING_MODE	"ENTER_SETTING_MODE"
#define POINT_CLICK			"POINT_CLICK"
#define RESET_ROI			"RESET_ROI"
#define COMPARING_MODE		"COMPARING_MODE"
#define WAITTING			"WAITTING"

using namespace std;
using namespace cv;

unsigned int	Number_of_ROI = 1;
unsigned int	Accuracy_Percent = 90;
unsigned int	Number_of_ROI_Temp;
unsigned int	Accuracy_Percent_Temp;
int				flag = 0;
bool			Setting_Mode_Flag = false;
bool			Config_Flag = false;
unsigned int	Compare_Total, Compare_Good, Compare_Bad;
//const char*	Current_Mode[] = {SET_MODE, SETTING_MODE, COMPARE_MODE, WAIT};
VideoCapture	cap;
Mat				frame, Show_Frame, Inspect_ROI;
vector<Mat>		Standard_ROI;
Point			temp, temp2;
vector<Point>	Inspect_ROI_Point;
vector<Point>	State_Message_Point;
vector<String>	State_Message_S;
Point			Rectangle_Point_x = Point(90, 90);
Point			Rectangle_Point_y = Point(165, 90);
Size			Rectangle_Size = Size(20, 15);
Point			Reset_Button_Point = Point(135, 230);
Size			Reset_Button_Size = Point(50, 20);
int				button_dis = 30;
double			Message_Font_Size = 0.4;

Point			Resolution_Point = Point(90, 180);
unsigned int	width, height;
int				State_Message_Flag = 0;

///////////////////////Count Segment/////////////////////////
void State_Message() {
	if (State_Message_S[6] != State_Message_S[7]) {
		State_Message_S[0] = State_Message_S[1];
		State_Message_S[1] = State_Message_S[2];
		State_Message_S[2] = State_Message_S[3];
		State_Message_S[3] = State_Message_S[4];
		State_Message_S[4] = State_Message_S[5];
		State_Message_S[5] = State_Message_S[6];
		State_Message_S[6] = State_Message_S[7];
	}

	for (int i = 6; i >= 0; i--) {
		putText(Show_Frame, State_Message_S[i], State_Message_Point[i], FONT_HERSHEY_DUPLEX, Message_Font_Size, Scalar(0, 0, 0), 2);
		putText(Show_Frame, State_Message_S[i], State_Message_Point[i], FONT_HERSHEY_DUPLEX, Message_Font_Size, Scalar(125, 125, 125), 1);
	}
}

void Compare_State(Scalar state_scalar) {
	rectangle(Show_Frame, Rect(width - 105, height - 30, 95, 25), Scalar(0, 0, 0), -1);
	rectangle(Show_Frame, Rect(width - 100, height - 25, 85, 15), state_scalar, -1);

}

void Compare_Result() {
	char Compare_Total_S[15], Compare_Good_S[15], Compare_Bad_S[15];
	sprintf(Compare_Total_S, "TOTAL  : %d", Compare_Total);
	sprintf(Compare_Good_S, "GOOD  : %d", Compare_Good);
	sprintf(Compare_Bad_S, "BAD    : %d", Compare_Bad);

	putText(Show_Frame, Compare_Total_S, Point(width - 105, height - 70), FONT_HERSHEY_DUPLEX, 0.5, Scalar(0, 0, 0), 3);
	putText(Show_Frame, Compare_Total_S, Point(width - 105, height - 70), FONT_HERSHEY_DUPLEX, 0.5, Scalar(0, 255, 0), 1);

	putText(Show_Frame, Compare_Good_S, Point(width - 105, height - 55), FONT_HERSHEY_DUPLEX, 0.5, Scalar(0, 0, 0), 3);
	putText(Show_Frame, Compare_Good_S, Point(width - 105, height - 55), FONT_HERSHEY_DUPLEX, 0.5, Scalar(0, 255, 0), 1);

	putText(Show_Frame, Compare_Bad_S, Point(width - 105, height - 40), FONT_HERSHEY_DUPLEX, 0.5, Scalar(0, 0, 0), 3);
	putText(Show_Frame, Compare_Bad_S, Point(width - 105, height - 40), FONT_HERSHEY_DUPLEX, 0.5, Scalar(0, 255, 0), 1);
}

void ALAM_Marking() {
	putText(Show_Frame, "=", Point(14, 42), FONT_HERSHEY_DUPLEX, 1, Scalar(0, 0, 0), 5);
	putText(Show_Frame, "ALAM", Point(40, 40), FONT_HERSHEY_DUPLEX, 0.7, Scalar(0, 0, 0), 4);

	putText(Show_Frame, "=", Point(14, 42), FONT_HERSHEY_DUPLEX, 1, Scalar(0, 255, 255), 2);
	putText(Show_Frame, "ALAM", Point(40, 40), FONT_HERSHEY_DUPLEX, 0.7, Scalar(0, 255, 255), 1);
}

void Center_Marking(double width, double height) {
	line(Show_Frame, Point(width / 2, height / 2 + 15), Point(width / 2, height / 2 - 15), Scalar(0, 0, 255), 1);
	line(Show_Frame, Point(width / 2 + 15, height / 2), Point(width / 2 - 15, height / 2), Scalar(0, 0, 255), 1);
}

void Setting_Mode() {
	char	Accuracy_Percent_S[5];
	char	Number_of_ROI_S[5];
	Point	Title_Point = Point(5, 102);
	Point	Value_Point = Point(128, 102);

	rectangle(Show_Frame, Rect(Title_Point - Point(2, 30) - Point(3, 3), Title_Point + Point(195, 180) + Point(3, 3)), Scalar(0, 0, 0), -1);
	rectangle(Show_Frame, Rect(Title_Point - Point(2, 30), Title_Point + Point(195, 180)), Scalar(125, 125, 125), -1);

	sprintf(Accuracy_Percent_S, "%d", Accuracy_Percent);
	sprintf(Number_of_ROI_S, "%d", Number_of_ROI);

	putText(Show_Frame, "Accuracy", Title_Point, FONT_HERSHEY_DUPLEX, 0.5, Scalar(0, 0, 0), 3);
	putText(Show_Frame, "Accuracy", Title_Point, FONT_HERSHEY_DUPLEX, 0.5, Scalar(255, 255, 255), 1);
	putText(Show_Frame, "ROI_Num", Title_Point + Point(0, button_dis), FONT_HERSHEY_DUPLEX, 0.5, Scalar(0, 0, 0), 3);
	putText(Show_Frame, "ROI_Num", Title_Point + Point(0, button_dis), FONT_HERSHEY_DUPLEX, 0.5, Scalar(255, 255, 255), 1);

	putText(Show_Frame, "Resolution", Resolution_Point - Point(45, 15), FONT_HERSHEY_DUPLEX, 0.5, Scalar(0, 0, 0), 3);
	putText(Show_Frame, "Resolution", Resolution_Point - Point(45, 15), FONT_HERSHEY_DUPLEX, 0.5, Scalar(255, 255, 255), 1);
	putText(Show_Frame, "640x480", Resolution_Point - Point(85, -15), FONT_HERSHEY_DUPLEX, 0.4, Scalar(0, 0, 0), 2);
	putText(Show_Frame, "640x480", Resolution_Point - Point(85, -15), FONT_HERSHEY_DUPLEX, 0.4, Scalar(255, 255, 255), 1);
	putText(Show_Frame, "1280x720", Resolution_Point - Point(85, -15 - button_dis),
		FONT_HERSHEY_DUPLEX, 0.4, Scalar(0, 0, 0), 2);
	putText(Show_Frame, "1280x720", Resolution_Point - Point(85, -15 - button_dis),
		FONT_HERSHEY_DUPLEX, 0.4, Scalar(255, 255, 255), 1);

	if (width == 640 && height == 480) {
		rectangle(Show_Frame, Rect(Resolution_Point + Point(-3, -3), Rectangle_Size + Size(6, 6)), Scalar(0, 0, 0), -1);
		rectangle(Show_Frame, Rect(Resolution_Point, Rectangle_Size), Scalar(0, 255, 0), -1);
		rectangle(Show_Frame, Rect(Resolution_Point + Point(-3, button_dis - 3), Rectangle_Size + Size(6, 6)), Scalar(0, 0, 0), -1);
		rectangle(Show_Frame, Rect(Resolution_Point + Point(0, button_dis), Rectangle_Size), Scalar(170, 170, 170), -1);

		putText(Show_Frame, "X", Resolution_Point + Point(0, 18), FONT_HERSHEY_DUPLEX, 1.0, Scalar(0, 0, 0), 2);
		putText(Show_Frame, "X", Resolution_Point + Point(0, 18) + Point(0, button_dis), FONT_HERSHEY_DUPLEX, 1.0, Scalar(0, 0, 0), 2);
	}
	else if (width == 1280 && height == 720) {
		rectangle(Show_Frame, Rect(Resolution_Point + Point(-3, -3), Rectangle_Size + Size(6, 6)), Scalar(0, 0, 0), -1);
		rectangle(Show_Frame, Rect(Resolution_Point, Rectangle_Size), Scalar(170, 170, 170), -1);
		rectangle(Show_Frame, Rect(Resolution_Point + Point(-3, button_dis - 3), Rectangle_Size + Size(6, 6)), Scalar(0, 0, 0), -1);
		rectangle(Show_Frame, Rect(Resolution_Point + Point(0, button_dis), Rectangle_Size), Scalar(0, 255, 0), -1);
	}

	/*////////////////////		+, - Button		////////////////////*/
	rectangle(Show_Frame, Rect(Rectangle_Point_x + Point(-3, -3), Rectangle_Size + Size(6, 6)), Scalar(0, 0, 0), -1);
	rectangle(Show_Frame, Rect(Rectangle_Point_x + Point(0, button_dis) + Point(-3, -3), Rectangle_Size + Size(6, 6)), Scalar(0, 0, 0), -1);
	rectangle(Show_Frame, Rect(Rectangle_Point_x, Rectangle_Size), Scalar(170, 170, 170), -1);
	rectangle(Show_Frame, Rect(Rectangle_Point_x + Point(0, button_dis), Rectangle_Size), Scalar(170, 170, 170), -1);

	putText(Show_Frame, "-", Rectangle_Point_x + Point(3, 12), FONT_HERSHEY_DUPLEX, 0.5, Scalar(0, 0, 0), 1);
	putText(Show_Frame, "-", Rectangle_Point_x + Point(0, button_dis) + Point(3, 12), FONT_HERSHEY_DUPLEX, 0.5, Scalar(0, 0, 0), 1);


	rectangle(Show_Frame, Rect(Rectangle_Point_y + Point(-3, -3), Rectangle_Size + Size(6, 6)), Scalar(0, 0, 0), -1);
	rectangle(Show_Frame, Rect(Rectangle_Point_y + Point(0, button_dis) + Point(-3, -3), Rectangle_Size + Size(6, 6)), Scalar(0, 0, 0), -1);
	rectangle(Show_Frame, Rect(Rectangle_Point_y, Rectangle_Size), Scalar(170, 170, 170), -1);
	rectangle(Show_Frame, Rect(Rectangle_Point_y + Point(0, button_dis), Rectangle_Size), Scalar(170, 170, 170), -1);

	putText(Show_Frame, "+", Rectangle_Point_y + Point(3, 12), FONT_HERSHEY_DUPLEX, 0.5, Scalar(0, 0, 0), 1);
	putText(Show_Frame, "+", Rectangle_Point_y + Point(0, button_dis) + Point(3, 12), FONT_HERSHEY_DUPLEX, 0.5, Scalar(0, 0, 0), 1);

	//OK Button	
	rectangle(Show_Frame, Rect(Resolution_Point - Point(-45, -10 - button_dis - button_dis) + Point(-3, -3),
		Reset_Button_Size + Size(6, 6)), Scalar(0, 0, 0), -1);
	rectangle(Show_Frame, Rect(Resolution_Point - Point(-45, -10 - button_dis - button_dis), Reset_Button_Size), Scalar(170, 170, 170), -1);
	putText(Show_Frame, "OK", Resolution_Point - Point(-55, -25 - button_dis - button_dis), FONT_HERSHEY_DUPLEX, 0.5, Scalar(0, 0, 0), 1);

	//Cancel Button
	rectangle(Show_Frame, Rect(Resolution_Point - Point(15, -10 - button_dis - button_dis) + Point(-3, -3),
		Reset_Button_Size + Size(6, 6)), Scalar(0, 0, 0), -1);
	rectangle(Show_Frame, Rect(Resolution_Point - Point(15, -10 - button_dis - button_dis), Reset_Button_Size), Scalar(170, 170, 170), -1);
	putText(Show_Frame, "Cancel", Resolution_Point - Point(17, -25 - button_dis - button_dis), FONT_HERSHEY_DUPLEX, 0.5, Scalar(0, 0, 0), 1);

	putText(Show_Frame, Accuracy_Percent_S, Value_Point, FONT_HERSHEY_DUPLEX, 0.5, Scalar(0, 0, 0), 3);
	putText(Show_Frame, Accuracy_Percent_S, Value_Point, FONT_HERSHEY_DUPLEX, 0.5, Scalar(255, 255, 255), 1);
	putText(Show_Frame, Number_of_ROI_S, Value_Point + Point(0, button_dis), FONT_HERSHEY_DUPLEX, 0.5, Scalar(0, 0, 0), 3);
	putText(Show_Frame, Number_of_ROI_S, Value_Point + Point(0, button_dis), FONT_HERSHEY_DUPLEX, 0.5, Scalar(255, 255, 255), 1);
	//putText(Show_Frame, "0", Value_Point + Point(0, 100), FONT_HERSHEY_DUPLEX, 0.5, Scalar(0, 0, 0), 3);
	//putText(Show_Frame, "0", Value_Point + Point(0, 100), FONT_HERSHEY_DUPLEX, 0.5, Scalar(255, 255, 255), 1);
}

void Mouse_Event(int event, int x, int y, int flags, void* userdata) {
	if (Setting_Mode_Flag == true && event == EVENT_LBUTTONDOWN) {
		if (((Rectangle_Point_x.x <= x) && (Rectangle_Point_x.x + Rectangle_Size.width >= x)) &&
			((Rectangle_Point_x.y <= y) && (Rectangle_Point_x.y + Rectangle_Size.height >= y))) {		//1-1
			if (Accuracy_Percent >= 90) {
				Accuracy_Percent--;
			}
			else {
				Accuracy_Percent -= 2;
			}

			if (Accuracy_Percent == -1 || Accuracy_Percent == -2) {
				Accuracy_Percent = 0;
			}
		}
		if (((Rectangle_Point_y.x <= x) && (Rectangle_Point_y.x + Rectangle_Size.width >= x)) &&
			((Rectangle_Point_y.y <= y) && (Rectangle_Point_y.y + Rectangle_Size.height >= y))) {		//1-2
			if (Accuracy_Percent >= 90) {
				Accuracy_Percent++;
			}
			else {
				Accuracy_Percent += 2;
			}

			if (Accuracy_Percent == 101) {
				Accuracy_Percent = 100;
			}
		}
		if ((Rectangle_Point_x.x <= x) && (Rectangle_Point_x.x + Rectangle_Size.width >= x) &&
			((Rectangle_Point_x.y + button_dis <= y) && (Rectangle_Point_x.y + button_dis + Rectangle_Size.height >= y))) {		//2-1
			Number_of_ROI--;
			if (Number_of_ROI == 0) {
				Number_of_ROI = 1;
			}

		}
		if (((Rectangle_Point_y.x <= x) && (Rectangle_Point_y.x + Rectangle_Size.width >= x)) &&
			((Rectangle_Point_y.y + button_dis <= y) && (Rectangle_Point_y.y + button_dis + Rectangle_Size.height >= y))) {		//2-2
			Number_of_ROI++;
			if (Number_of_ROI == 6) {
				Number_of_ROI = 5;
			}

		}
		if (((Resolution_Point.x - 15 <= x) && (Resolution_Point.x - 15 + Reset_Button_Size.width >= x)) &&
			((Resolution_Point.y + 10 + button_dis + button_dis <= y) &&
				(Resolution_Point.y + 10 + button_dis + button_dis + Reset_Button_Size.height >= y))) {		//Cancel_Button
			Number_of_ROI = Number_of_ROI_Temp;
			Accuracy_Percent = Accuracy_Percent_Temp;
			State_Message_S[7] = "Cancel";
			flag = -1;
		}
		if (((Resolution_Point.x + 45 <= x) && (Resolution_Point.x + 45 + Reset_Button_Size.width >= x)) &&
			((Resolution_Point.y + 10 + button_dis + button_dis <= y) &&
				(Resolution_Point.y + 10 + button_dis + button_dis + Reset_Button_Size.height >= y))) {		//OK_Button
			if (Number_of_ROI == Number_of_ROI_Temp && Accuracy_Percent == Accuracy_Percent_Temp) {
				flag = -1;
			}
			else if (Number_of_ROI != Number_of_ROI_Temp && Accuracy_Percent == Accuracy_Percent_Temp) {
				Inspect_ROI_Point.clear();
				Standard_ROI.clear();
				flag = 0;
			}
			else if (Number_of_ROI == Number_of_ROI_Temp && Accuracy_Percent != Accuracy_Percent_Temp) {
				flag = -1;
			}
			else if (Number_of_ROI != Number_of_ROI_Temp && Accuracy_Percent != Accuracy_Percent_Temp) {
				Inspect_ROI_Point.clear();
				Standard_ROI.clear();
				flag = 0;
			}

			State_Message_S[7] = "OK";
		}
	}

	////ALAM_MARK////
	if (((10 <= x) && (105 >= x)) && ((15 <= y) && (50 >= y)) && event == EVENT_LBUTTONDOWN) {
		State_Message_S[7] = "SETTING_MODE";
		Setting_Mode_Flag = !Setting_Mode_Flag;

		Number_of_ROI_Temp = Number_of_ROI;
		Accuracy_Percent_Temp = Accuracy_Percent;

		flag = 3;
		if (Setting_Mode_Flag == false) {
			State_Message_S[7] = "COMPARING_MODE";
			flag = -1;
		}
	}

	////Resolution Button////			640x480, 1280x720, 1920x1080
	//if (((Resolution_Point.x <= x) && (Resolution_Point.x + Rectangle_Size.width >= x)) &&
	//	((Resolution_Point.y <= y) && (Resolution_Point.y + Rectangle_Size.height >= y)) && event == EVENT_LBUTTONDOWN) {
	//	cap.set(3, 640);
	//	cap.set(4, 480);
	//	width = cap.get(CAP_PROP_FRAME_WIDTH);
	//	height = cap.get(CAP_PROP_FRAME_HEIGHT);

	//	State_Message_Point.clear();
	//	State_Message_Point.push_back(Point(15, height - 125));
	//	State_Message_Point.push_back(Point(15, height - 110));
	//	State_Message_Point.push_back(Point(15, height - 95));
	//	State_Message_Point.push_back(Point(15, height - 80));
	//	State_Message_Point.push_back(Point(15, height - 65));
	//	State_Message_Point.push_back(Point(15, height - 50));
	//	State_Message_Point.push_back(Point(15, height - 35));
	//	State_Message_Point.push_back(Point(15, height - 20));

	//	State_Message_S[7] = "Res : 640x480";
	//}
	//else if (((Resolution_Point.x <= x) && (Resolution_Point.x + Rectangle_Size.width >= x)) &&
	//	((Resolution_Point.y + button_dis <= y) && (Resolution_Point.y + button_dis + Rectangle_Size.height >= y)) && event == EVENT_LBUTTONDOWN) {
	//	cap.set(3, 1280);
	//	cap.set(4, 720);
	//	width = cap.get(CAP_PROP_FRAME_WIDTH);
	//	height = cap.get(CAP_PROP_FRAME_HEIGHT);

	//	State_Message_Point.clear();
	//	State_Message_Point.push_back(Point(15, height - 125));
	//	State_Message_Point.push_back(Point(15, height - 110));
	//	State_Message_Point.push_back(Point(15, height - 95));
	//	State_Message_Point.push_back(Point(15, height - 80));
	//	State_Message_Point.push_back(Point(15, height - 65));
	//	State_Message_Point.push_back(Point(15, height - 50));
	//	State_Message_Point.push_back(Point(15, height - 35));
	//	State_Message_Point.push_back(Point(15, height - 20));
	//	Message_Font_Size = 0.5;

	//	State_Message_S[7] = "Res : 1280x720";
	//}
	//else if (((Resolution_Point.x <= x) && (Resolution_Point.x + Rectangle_Size.width >= x)) &&
	//	((Resolution_Point.y + button_dis + button_dis <= y) && (Resolution_Point.y + button_dis + button_dis + Rectangle_Size.height >= y)) &&
	//	event == EVENT_LBUTTONDOWN) {
	//	cap.set(3, 1920);
	//	cap.set(4, 1080);
	//	width = cap.get(CAP_PROP_FRAME_WIDTH);
	//	height = cap.get(CAP_PROP_FRAME_HEIGHT);

	//	State_Message_Point.clear();
	//	State_Message_Point.push_back(Point(15, height - 125));
	//	State_Message_Point.push_back(Point(15, height - 110));
	//	State_Message_Point.push_back(Point(15, height - 95));
	//	State_Message_Point.push_back(Point(15, height - 80));
	//	State_Message_Point.push_back(Point(15, height - 65));
	//	State_Message_Point.push_back(Point(15, height - 50));
	//	State_Message_Point.push_back(Point(15, height - 35));
	//	State_Message_Point.push_back(Point(15, height - 20));
	//	Message_Font_Size = 0.6;

	//	State_Message_S[7] = "Res : 1920x1080";
	//}

	if (event == EVENT_LBUTTONDBLCLK && (flag == 0 || flag == 1)) {
		temp = Point(x, y);
		Inspect_ROI_Point.push_back(temp);
		State_Message_S[7] = "POINT_CLICK";
		flag++;
	}

	if (flags == EVENT_FLAG_LBUTTON && event == EVENT_MOUSEMOVE && flag == 1) {
		rectangle(Show_Frame, Rect(temp, Point(x, y)), Scalar(0, 0, 255), 2);
		imshow("Show_Frame", Show_Frame);
	}

	if (event == EVENT_LBUTTONUP && flag == 1) {
		temp2 = Point(x, y);
		if (temp2 != temp) {
			Inspect_ROI_Point.push_back(temp2);
			flag++;
		}
		else if (temp2 == temp) {
			Inspect_ROI_Point.clear();
			flag = 0;
		}

		if (flag == 2) {
			if (Inspect_ROI_Point.size() / 2 == Number_of_ROI) {
				for (int i = 0; i < Inspect_ROI_Point.size(); i += 2) {
					Standard_ROI.push_back(Mat(frame, Rect(Point(Inspect_ROI_Point[i]),
						Point(Inspect_ROI_Point[i + 1]))).clone());
				}

				flag = -1;
			}
			else {
				flag = 0;
			}
		}
	}
}


int main() {
	cap = VideoCapture(WEB_CAM);				//WEB_CAM, TEST_VIDEO_1920P
	if (!cap.isOpened()) {
		cout << "Could not find or open Video" << endl;
		return -1;
	}

	namedWindow("Show_Frame");
	setMouseCallback("Show_Frame", Mouse_Event);

	cap.set(3, 640);
	cap.set(4, 480);
	width = cap.get(CAP_PROP_FRAME_WIDTH);
	height = cap.get(CAP_PROP_FRAME_HEIGHT);

	State_Message_Point.clear();
	State_Message_Point.push_back(Point(15, height - 125));
	State_Message_Point.push_back(Point(15, height - 110));
	State_Message_Point.push_back(Point(15, height - 95));
	State_Message_Point.push_back(Point(15, height - 80));
	State_Message_Point.push_back(Point(15, height - 65));
	State_Message_Point.push_back(Point(15, height - 50));
	State_Message_Point.push_back(Point(15, height - 35));
	State_Message_Point.push_back(Point(15, height - 20));

	State_Message_S.push_back(String("  "));
	State_Message_S.push_back(String("  "));
	State_Message_S.push_back(String("  "));
	State_Message_S.push_back(String("  "));
	State_Message_S.push_back(String("  "));
	State_Message_S.push_back(String("  "));
	State_Message_S.push_back(String("  "));
	State_Message_S.push_back(String("  "));
	State_Message_S[7] = "Res : 640x480";

	vector<unsigned int>	Config_Data;
	FILE* fp = fopen("Log_data2.txt", "r");
	if (fp != NULL) {
		char line[255];
		while (fgets(line, sizeof(line), fp) != NULL) {
			Config_Data.push_back(atoi(line));
		}

		//if (Config_Data[0] == 640 && Config_Data[1] == 480) {
		//	cap.set(3, 640);
		//	cap.set(4, 480);
		//	width = cap.get(CAP_PROP_FRAME_WIDTH);
		//	height = cap.get(CAP_PROP_FRAME_HEIGHT);
		//	cout << width << endl;
		//	cout << height << endl;

		//	State_Message_Point.clear();
		//	State_Message_Point.push_back(Point(15, height - 125));
		//	State_Message_Point.push_back(Point(15, height - 110));
		//	State_Message_Point.push_back(Point(15, height - 95));
		//	State_Message_Point.push_back(Point(15, height - 80));
		//	State_Message_Point.push_back(Point(15, height - 65));
		//	State_Message_Point.push_back(Point(15, height - 50));
		//	State_Message_Point.push_back(Point(15, height - 35));
		//	State_Message_Point.push_back(Point(15, height - 20));

		//	State_Message_S[7] = "Res : 640x480";
		//}
		//else if (Config_Data[0] == 1280 && Config_Data[1] == 720) {
		//	cap.set(3, 1280);
		//	cap.set(4, 720);
		//	width = cap.get(CAP_PROP_FRAME_WIDTH);
		//	height = cap.get(CAP_PROP_FRAME_HEIGHT);

		//	State_Message_Point.clear();
		//	State_Message_Point.push_back(Point(15, height - 125));
		//	State_Message_Point.push_back(Point(15, height - 110));
		//	State_Message_Point.push_back(Point(15, height - 95));
		//	State_Message_Point.push_back(Point(15, height - 80));
		//	State_Message_Point.push_back(Point(15, height - 65));
		//	State_Message_Point.push_back(Point(15, height - 50));
		//	State_Message_Point.push_back(Point(15, height - 35));
		//	State_Message_Point.push_back(Point(15, height - 20));
		//	Message_Font_Size = 0.5;

		//	State_Message_S[7] = "Res : 1280x720";
		//}

		if (Config_Data.size() >= 3) {
			Number_of_ROI = Config_Data[2];
		}

		if (Config_Data.size() >= 4) {
			Accuracy_Percent = Config_Data[3];
		}

		if (Config_Data.size() >= 5) {
			int j = 0;
			for (int i = 4; i < Config_Data.size(); i += 2) {
				Point temp_pt = Point(Config_Data[i], Config_Data[i + 1]);
				Inspect_ROI_Point.push_back(temp_pt);
				j++;
			}

			if (Inspect_ROI_Point.size() / 2 == Number_of_ROI) {
				Config_Flag = true;
				flag = -1;
			}
		}

		fclose(fp);
	}

	int key = 0;
	Compare_Total = 0;
	Compare_Good = 0;
	Compare_Bad = 0;

	while (1) {
		cap >> frame;
		if (frame.empty())
			break;

		//Frame Clone
		Show_Frame = frame.clone();
		Compare_State(Scalar(0, 255, 255));

		if (Config_Flag == true) {
			for (int i = 0; i < Inspect_ROI_Point.size(); i += 2) {
				Standard_ROI.push_back(Mat(frame, Rect(Point(Inspect_ROI_Point[i]),
					Point(Inspect_ROI_Point[i + 1]))).clone());
			}

			Config_Flag = false;
		}

		if (flag == 1) {
			circle(Show_Frame, temp, 2, Scalar(0, 0, 255), -1);
		}
		else if (flag == -1 && key == 32) {
			clock_t	start, end;
			double	result;
			double maxv;
			char	maxv_S[11];
			char	result_S[10];
			unsigned char	Standard_ROI_Count = 0;
			bool			Compare_Flag = true;

			start = clock();
			for (int i = 0; i < Inspect_ROI_Point.size(); i += 2) {
				Inspect_ROI = Mat(frame, Rect(Point(Inspect_ROI_Point[i]), Point(Inspect_ROI_Point[i + 1])));
				Mat res, res_norm;
				matchTemplate(Inspect_ROI, Standard_ROI[Standard_ROI_Count], res, TM_CCOEFF_NORMED);
				Standard_ROI_Count++;
				normalize(res, res_norm, 0, 255, NORM_MINMAX, CV_8U);

				Point maxloc;
				minMaxLoc(res, 0, &maxv, 0, &maxloc);
				sprintf(maxv_S, "%d : %.2f", Standard_ROI_Count, maxv * 100);
				State_Message_S[7] = maxv_S;
				State_Message();

				if (maxv * 100 < Accuracy_Percent) {
					Compare_Flag = false;
				}
			}
			end = clock();

			result = (double)(end - start);
			cout << result / CLOCKS_PER_SEC << endl;
			sprintf(result_S, "%.3fms", result / CLOCKS_PER_SEC);
			State_Message_S[7] = result_S;
			//State_Message();


			if (Compare_Flag == false) {
				Compare_Bad++;
				Compare_Total++;
				Compare_State(Scalar(0, 0, 255));
			}
			else {
				Compare_Good++;
				Compare_Total++;
				Compare_State(Scalar(0, 255, 0));
			}
			Compare_Flag = true;

			for (int i = 0; i < Inspect_ROI_Point.size(); i += 2) {
				rectangle(Show_Frame, Rect(Point(Inspect_ROI_Point[i]),
					Point(Inspect_ROI_Point[i + 1])), Scalar(0, 0, 255), 2);
			}
		}
		else if (flag == -1) {
			for (int i = 0; i < Inspect_ROI_Point.size(); i += 2) {
				rectangle(Show_Frame, Rect(Point(Inspect_ROI_Point[i]),
					Point(Inspect_ROI_Point[i + 1])), Scalar(0, 0, 255), 2);
			}
		}
		else if (flag == 3 && Setting_Mode_Flag == true) {
			Setting_Mode();
		}
		else if (flag == 0) {
			for (int i = 0; i < Inspect_ROI_Point.size(); i += 2) {
				rectangle(Show_Frame, Rect(Point(Inspect_ROI_Point[i]),
					Point(Inspect_ROI_Point[i + 1])), Scalar(0, 0, 255), 2);
			}
		}

		State_Message();
		Center_Marking(width, height);
		ALAM_Marking();
		Compare_Result();

		imshow("Show_Frame", Show_Frame);
		key = waitKey(33);
		if (key == 27)
			break;
	}
	FILE* fp_fin = fopen("Log_data2.txt", "w");
	char Fput_STR[255];

	width = cap.get(CAP_PROP_FRAME_WIDTH);
	sprintf(Fput_STR, "%d\n", width);
	fputs(Fput_STR, fp_fin);

	height = cap.get(CAP_PROP_FRAME_HEIGHT);
	sprintf(Fput_STR, "%d\n", height);
	fputs(Fput_STR, fp_fin);

	sprintf(Fput_STR, "%d\n", Number_of_ROI);
	fputs(Fput_STR, fp_fin);

	sprintf(Fput_STR, "%d\n", Accuracy_Percent);
	fputs(Fput_STR, fp_fin);

	for (int i = 0; i < Inspect_ROI_Point.size(); i++) {
		sprintf(Fput_STR, "%d\n", Inspect_ROI_Point[i].x);
		fputs(Fput_STR, fp_fin);
		sprintf(Fput_STR, "%d\n", Inspect_ROI_Point[i].y);
		fputs(Fput_STR, fp_fin);
	}

	fclose(fp_fin);

	return 0;
}

Model ALAM-A(N-Com) 실행 파일

Project1.7z
12.67MB

압축 해제가 안 될 경우 아래 7-Zip을 설치한 후 압축 해제를 하면 된다.

실행파일과 "opencv_world460.dll" 파일이 꼭! 같은 폴더에 위치해 있어야 한다..!!

 

 

7-Zip

7-Zip 7-Zip is a file archiver with a high compression ratio. Download 7-Zip 22.01 (2022-07-15) for Windows: Link Type Windows Size Download .exe 64-bit x64 1.5 MB Download .exe 32-bit x86 1.2 MB Download .exe 64-bit ARM64 1.5 MB License 7-Zip is free soft

www.7-zip.org

 

//사용 방법

초기 셋팅

Accuracy(일치도) : 90

ROI_Num(선택 영역 개수) : 1

Resolution(해상도) : 640x480 (고정)

 

Model ALAM-A(N-Com) 실행 후 

왼쪽 버튼 더블클릭 후 원하는 영역까지 드래그 한 후 왼쪽 버튼 UP

ROI_Num 개수만큼 지정 후

(N-Com Model)SpaceBar 누를 때 마다 1번 검사

(Com Model)특정 시그널이 올 때 마다 검사

 

종료 키는 ESC 

종료시 종료 전에 데이터 자동 저장

Log_data2.txt 파일 생성(Accuracy, ROI_Num, ROI Area, Resolution 정보 저장 파일)

다음 실행시 Log_data2 정보를 불러와 자동으로 실행