프로젝트1-코드리뷰(중)
success, box = tracker.update(img) #정보 업데이트하는 중. init된 것을 계속 업데이트해서 객체를 추적 반환 값으로 해당 좌표를 반환. box에는 좌표가 담긴다. success는 성공여부인듯.
left, top, w, h = [int(v) for v in box] #좌표를 소분화한다.
right = left + w #좌측 + 너비
bottom = top + h # 위쪽 + 높이
top_bottom_list.append(np.array([top, bottom])) #top, bottom꼴로 묶어 만든 numpy배열 추가
left_right_list.append(np.array([left, right])) #left, right꼴로 묶어 만든 numpy배열 추가
#공부 필요!
if len(top_bottom_list) > 10: # 윈도우 길이보다 배열로 나타내야할 길이가 10보다 크면 첫번째 배열을 삭제한다.
del top_bottom_list[0]
del left_right_list[0]
avg_height_range = np.mean(top_bottom_list, axis=0).astype(int) #평균을 내는 것임. 탑과 바텀의 평균을 정수로
avg_width_range = np.mean(left_right_list, axis=0).astype(int) #좌측과 우측의 평균을 정수로
avg_center = np.array([np.mean(avg_width_range), np.mean(avg_height_range)]) # (x, y) #너비평균과 높이 평균을 추가 즉 중심임.
scale = 2.0 #클수록 많이 보여줌.
avg_height = (avg_height_range[1] - avg_height_range[0]) * scale #높이 평균이다 탑에서 바텀을 빼서 scale을 곱해서 높이평균을 만듦 그리고 scale은 트래킹된 영상을 보여줄 건데 해당 ROI에서 얼마만큼 더 보여줄 것인지 정하는것 넉넉히 2.0으로가봄
avg_width = (avg_width_range[1] - avg_width_range[0]) * scale #너비평균 우측에서 좌측을 뺀 것에 scale을 곱해서 너비평균을 만듦
avg_height_range = np.array([avg_center[1] - avg_height / 2, avg_center[1] + avg_height / 2]) #중심에서 원하는 높이의 절반을 빼고 절반을 더하면 각각 상단 하단으로 새로운 height 배열이 만들어짐
avg_width_range = np.array([avg_center[0] - avg_width / 2, avg_center[0] + avg_width / 2]) #중심에서 원하는 너비의 절반을 빼고 절반을 더하면 각각 좌측 우측으로 width 배열이 만들어짐
if fit_to == 'width': #는 무조건 height
avg_height_range = np.array([
avg_center[1] - avg_width * output_size[1] / output_size[0] / 2,
avg_center[1] + avg_width * output_size[1] / output_size[0] / 2
]).astype(int).clip(0, 9999)
avg_width_range = avg_width_range.astype(int).clip(0, 9999)
elif fit_to == 'height': #아마 여기 통과할 듯
avg_height_range = avg_height_range.astype(int).clip(0, 9999) #간단하게 삑사리 방지용으로 0이하값은 0으로 9999이상값은 9999로 min하고 max를 정해두는 것임. 범위 벗어나지 않게 하려는 것.
avg_width_range = np.array([
avg_center[0] - avg_height * output_size[0] / output_size[1] / 2, #평균너비에다가 (평균 높이에 처음 정한 너비대 높이 비율을 곱하고 /2해준 것을 뺀 것이 left
avg_center[0] + avg_height * output_size[0] / output_size[1] / 2 #이건 반대로 더한것이 right
]).astype(int).clip(0, 9999) #에서 삑사리 방지.#마찬가지지만 일단 width범위를 다시 지정.
중편에서 주로 다루는 내용은 데이터 가공을 통하여 roi(관심영역)에 맞춰서 기존 영상을 리사이즈 하는 것이다.
이것이 쉬워보이지만 이렇게 코드가 긴 이유는
영상에서 roi는 계속해서 움직이기 때문에 roi의 좌표를 받아서 그에 대응하는 사이즈를 만들어야 하기 때문이다.
코드를 간단하게 설명하면 프레임별 roi위치를 모으고 높이와 너비를 각각 2로 나누면 그 값은 roi의 중앙이 될 것이다. 그럼 그 중앙의 좌표에서 새롭게 정한 높이와 너비를 각각 더해주고 빼주면 되는 것이다.
상세 코드 리뷰
success, box = tracker.update(img) #정보 업데이트하는 중. init된 것을 계속 업데이트해서 객체를 추적 반환 값으로 해당 좌표를 반환. box에는 좌표가 담긴다. success는 성공여부인듯.
left, top, w, h = [int(v) for v in box] #좌표를 소분화한다.
right = left + w #좌측 + 너비
bottom = top + h # 위쪽 + 높이
top_bottom_list.append(np.array([top, bottom])) #top, bottom꼴로 묶어 만든 numpy배열 추가
left_right_list.append(np.array([left, right])) #left, right꼴로 묶어 만든 numpy배열 추가
#공부 필요!
if len(top_bottom_list) > 10: # 윈도우 길이보다 배열로 나타내야할 길이가 10보다 크면 첫번째 배열을 삭제한다.
del top_bottom_list[0]
del left_right_list[0]
avg_height_range = np.mean(top_bottom_list, axis=0).astype(int) #평균을 내는 것임. 탑과 바텀의 평균을 정수로
avg_width_range = np.mean(left_right_list, axis=0).astype(int) #좌측과 우측의 평균을 정수로
avg_center = np.array([np.mean(avg_width_range), np.mean(avg_height_range)]) # (x, y) #너비평균과 높이 평균을 추가 즉 중심임.
sucess가 담고 있는 것은 성공여부다. update 함수는 트래킹되는 roi의 상태와 성공여부를 가져온다.
box에는 각각 좌상단, 우하단이 들어있다. 0,0좌표와 m-1, n-1좌표의 느낌이다.
이 네가지만 알아도 중심부를 알 수 있다.
(좌 + 너비(길이)는 우측, 상단 + 높이(길이)는 하단 이런식으로 알 수 있음.)
그리고는 이들의 평균을 낸다.
np.mean은 평균을 내주는 함수고 나누다보면 실수가 나오는 경우가 많기에 int로 형변환도 해준다. 이런 좌와 우를 더해서 나눈 평균은 중심점이기에
width, height는 x, y꼴의 중심축이 된다.
scale = 2.0 #클수록 많이 보여줌.
avg_height = (avg_height_range[1] - avg_height_range[0]) * scale #높이 평균이다 탑에서 바텀을 빼서 scale을 곱해서 높이평균을 만듦 그리고 scale은 트래킹된 영상을 보여줄 건데 해당 ROI에서 얼마만큼 더 보여줄 것인지 정하는것 넉넉히 2.0으로가봄
avg_width = (avg_width_range[1] - avg_width_range[0]) * scale #너비평균 우측에서 좌측을 뺀 것에 scale을 곱해서 너비평균을 만듦
avg_height_range = np.array([avg_center[1] - avg_height / 2, avg_center[1] + avg_height / 2]) #중심에서 원하는 높이의 절반을 빼고 절반을 더하면 각각 상단 하단으로 새로운 height 배열이 만들어짐
avg_width_range = np.array([avg_center[0] - avg_width / 2, avg_center[0] + avg_width / 2]) #중심에서 원하는 너비의 절반을 빼고 절반을 더하면 각각 좌측 우측으로 width 배열이 만들어짐
이후에 전체 영상에서 roi를 포함한 특정 영역만 나타내기 위해서
우측 - 좌측, 하단 - 상단(우측일수록, 하단일수록 더 크기에 우측에서 좌측, 하단에서 상단을 빼는 것임.)에다 각각에 원하는 만큼의 scale을 곱해서 사이즈를 조정한다.
후에 중심축에서 상하좌우로 높이, 너비를 빼고 더하여 scale로 사이즈가 조정된 새로운 top-bottom, left, left-right를 만든다.
if fit_to == 'width': #는 무조건 height
avg_height_range = np.array([
avg_center[1] - avg_width * output_size[1] / output_size[0] / 2,
avg_center[1] + avg_width * output_size[1] / output_size[0] / 2
]).astype(int).clip(0, 9999)
avg_width_range = avg_width_range.astype(int).clip(0, 9999)
elif fit_to == 'height': #아마 여기 통과할 듯
avg_height_range = avg_height_range.astype(int).clip(0, 9999) #간단하게 삑사리 방지용으로 0이하값은 0으로 9999이상값은 9999로 min하고 max를 정해두는 것임. 범위 벗어나지 않게 하려는 것.
avg_width_range = np.array([
avg_center[0] - avg_height * output_size[0] / output_size[1] / 2, #평균너비에다가 (평균 높이에 처음 정한 너비대 높이 비율을 곱하고 /2해준 것을 뺀 것이 left
avg_center[0] + avg_height * output_size[0] / output_size[1] / 2 #이건 반대로 더한것이 right
]).astype(int).clip(0, 9999) #에서 삑사리 방지.#마찬가지지만 일단 width범위를 다시 지정.
후에 사이즈를 조정한다. 너비에 맞추는지 높이에 맞추는지를 정하고(본 코드에서는 높이에 맞춤)
해당 기준은 그대로 두고 그에 상응하는 너비, 높이를 재정의한다.
높이/너비 의 비율을 통해 새로운 너비를 곱하여 새로운 높이를 비율에 맞게 정의할 수 있다.
이제 높이와 너비를 정하였으니 직접적으로 값을 자르고 출력하는 일만 남았다.
Author And Source
이 문제에 관하여(프로젝트1-코드리뷰(중)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@soe8192/프로젝트1-코드리뷰중저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)