박민혀기

비전 검사기 Model CELLON 시간 측정(2022년 11월 06일) 본문

CELLON Vision/Test Result

비전 검사기 Model CELLON 시간 측정(2022년 11월 06일)

박민혀기 2022. 11. 6. 18:51

라즈베리파이 CM4 기준

ROI_NUM = 40

Frame Processing Average = 0.356sec

TimeData_40_RPI.txt
0.00MB

 

연구실 PC기준

 

ROI_NUM = 20

Frame Processing Average = 0.037sec

TimeData_ROI 20.txt
0.01MB

 

ROI_NUM = 50

Frame Processing Average = 0.07sec

TimeData_ROI 50.txt
0.00MB

시간 평균 값 계산 프로그램

import os

f = open('TimeData_40_RPI.txt')

lines = f.readlines()
lines[:2]

total = 0

for i in lines[:]:
    total =+ float(i)

print(total)

 

 

아래 코드로 실행

// 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, "CELLON", Point(45, 40), FONT_HERSHEY_DUPLEX, 0.6, Scalar(0, 0, 0), 4);



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

	putText(Show_Frame, "CELLON", Point(45, 40), FONT_HERSHEY_DUPLEX, 0.6, 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;

			Setting_Mode_Flag = !Setting_Mode_Flag;

			State_Message_S[7] = "Cancel";

			State_Message();



			if (Inspect_ROI_Point.size() / 2 == Number_of_ROI) {

				State_Message_S[7] = "COMPARING_MODE";

				flag = -1;

			}

			else {

				State_Message_S[7] = "POINT_CLICK";

				flag = 0;

			}

		}

		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;

			}



			Setting_Mode_Flag = !Setting_Mode_Flag;

			State_Message_S[7] = "OK";

		}

	}



	////ALAM_MARK////

	if (((10 <= x) && (105 >= x)) && ((15 <= y) && (50 >= y)) && event == EVENT_LBUTTONDOWN) {

		Setting_Mode_Flag = !Setting_Mode_Flag;



		Number_of_ROI_Temp = Number_of_ROI;

		Accuracy_Percent_Temp = Accuracy_Percent;



		if (Setting_Mode_Flag == false) {

			if (Inspect_ROI_Point.size() / 2 == Number_of_ROI) {

				State_Message_S[7] = "COMPARING_MODE";

				flag = -1;

			}

			else {

				State_Message_S[7] = "POINT_CLICK";

				flag = 0;

			}

		}

		else {

			State_Message_S[7] = "SETTING_MODE";



			flag = 3;

		}

	}



	////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(TEST_VIDEO);				//WEB_CAM, TEST_VIDEO_1920P, TEST_VIDEO

	if (!cap.isOpened()) {

		cout << "Could not find or open Video" << endl;

		return -1;

	}

	namedWindow("Show_Frame", WINDOW_FULLSCREEN);

	setMouseCallback("Show_Frame", Mouse_Event);

	cap.set(3, 640);

	cap.set(4, 480);

	width = 640;

	height = 480;

	for (int i = 0; i < 30; i++) {
		cap >> frame;
		imshow("Show_Frame", frame);
		waitKey(1);
	}



	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.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);

			}

		}



		//		cout << "flag : " << flag << endl << "Setting_Mode_Flag : " << Setting_Mode_Flag << endl;



		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];

	if (fp != NULL) {

		sprintf(Fput_STR, "%d\n", width);

		fputs(Fput_STR, fp_fin);


		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;

}

Log_data2.txt
0.00MB