본문 바로가기
정나우/Jetson

[yolov4] Bounding box 중심점 출력하기

by 정_나우 2022. 3. 28.

물체를 인식하고 쫓아가기 위해서는 화면상에 물체가 어디에 위치하는지 알아야 합니다.

 

그러기 위해서는 바운딩 박스의 정보(시작점의 xy좌표, 박스의 크기)를 받아야 합니다.

 

darknet에서는 이 기능을 제공하고 있습니다.

 

darknet을 실행할 때 

./darknet detector demo data/obj.data yolov4.cfg backup/yolov4_best.weights -c 0

여기에서

 

./darknet detector demo data/obj.data yolov4.cfg backup/yolov4_best.weights -c 0 -ext_output

이렇게 끝에 -ext_output만 추가해주면 바운딩 박스의 좌표와 크기를 알 수 있습니다.

 

하지만 제가 출력하고 싶은 건 박스의 중심좌표이므로 코드를 수정해줍니다.

 

darknet/src/image_opencv.cpp에 들어가서 ctrl+f로 ext_output을 검색해서 두번째 검색결과로 이동합니다.

 

그리고

if (ext_output)
	printf("\t(left_x: %4.0f   top_y: %4.0f   width: %4.0f   height: %4.0f)\n",
	(float)left, (float)top, b.w*0.5*show_img->cols, b.h*0.5*show_img->rows);

이 내용을

 

if (ext_output)
	printf("\t(center: %4.0f, %4.0f)\n",
	(float)left + b.w*0.5*show_img->cols, (float)top + b.h*0.5*show_img->rows);

다음과 같이 바꿔줍니다.

 

시작점에서 폭과 너비의 반틈만큼을 더해주어 중앙값을 계산합니다.

 

만약 opencv를 이용해 중심점에 점을 찍어 시각적으로 확인하고 싶다면

if (ext_output)
{
	int center_x = (float)left + b.w*0.5*show_img->cols;
	int center_y = (float)top + b.h*0.5*show_img->rows;
               
	printf("\t(center: %4.0f, %4.0f)\n",
	center_x, center_y);
        
	cv::line(*show_img,cv::Point(center_x,center_y),
	cv::Point(center_x,center_y),
	cv::Scalar(0,0,255),10);
}

다음과 같이 입력해줍니다.

 

그리고 darknet으로 돌아와 make를 다시 해주고 실행하면

 

 

보기와 같이 터미널 창에는 중심값이 나오고 화면에는 중심점이 나오는 것을 확인할 수 있습니다.

댓글