OpenCV 테두리 검출

주변 은 인류 시각 과 컴퓨터 시각 에서 모두 중요 한 역할 을 한다.
인 류 는 배경 실루엣 이나 스케치 만으로 물체 의 유형 과 자 세 를 식별 할 수 있다.
그 중에서 OpenCV 는 많은 가장자리 감지 필터 함 수 를 제공 합 니 다.이 필터 함 수 는 비 가장자리 구역 을 검은색 으로 바 꾸 고 가장자리 구역 을 흰색 이나 다른 포화 색 으로 바 꿉 니 다.
그러나 이 필터 함수 들 은 소음 을 가장자리 로 잘못 인식 하기 쉬 우 므 로 모호 한 처리 가 필요 하 다.
이번 퍼 지 작업 은 고 스 퍼 지(저 통 필터)를 사용 하 며,가장 많이 사용 되 는 퍼 지 필터(평활 필터)중 하 나 는 고주파 신호 강 도 를 약화 시 키 는 저 통 필터 이다.
저 통 여과 기 는 픽 셀 과 주변 픽 셀 의 밝기 차이 가 특정한 값 보다 적 을 때 이 픽 셀 의 밝 기 를 부 드 럽 게 하고 주로 소음 제거 와 모호 화 에 사용 합 니 다.
테두리 검출 은 OpenCV 의 Canny 함 수 를 사용 하여 이 루어 집 니 다.알고리즘 은 복잡 하지만 코드 는 간단 합 니 다.
5 단계 에서 고 스 필 터 를 사용 하여 이미지 의 소음 을 제거 하고 사다 리 를 계산 하 며 가장자리 에 최대 억제(NMS)를 사용 하고 검 측 된 가장자리 에 쌍(double)한도 값 을 사용 하여 양성(false positive)을 제거 하고 모든 가장자리 와 연결 을 분석 하 며 진정한 가장 자 리 를 보존 하고 뚜렷 하지 않 은 가장 자 리 를 제거한다.
다음은'점프'의 가장자리 검 사 를 실현 하여 사각형 의 중심 위 치 를 얻 을 수 있 습 니 다.
/01/테두리 검출
Canny 테두리 검출 코드 는 다음 과 같 습 니 다.

import cv2
import numpy as np
#      
img = cv2.imread('game.png', 0)
#      
cv2.namedWindow('img', 0)
cv2.resizeWindow('img', 400, 600)
cv2.imshow('img', img)
#     
img_rgb = cv2.GaussianBlur(img, (5, 5), 0)
canny_img = cv2.Canny(img_rgb, 1, 10)
#         
cv2.namedWindow('canny', 0)
cv2.resizeWindow('canny', 400, 600)
cv2.imshow('canny', canny_img)
#             
H, W = canny_img.shape
print(H, W)

출력 된 그림 의 높이 는 각각 1920 과 1080 이다.
다음은 원본 그림 그 레이스 케 일과 테두리 감지 그림 입 니 다.

다음은 테두리 검 사 를 통 해 사각형 의 첫 번 째 정점(상단)을 찾 습 니 다.

#         ,row   (         ),max(row)           
y_top = np.nonzero([max(row) for row in canny_img[400:]])[0][0] + 400
그림 의 높이 가 400 이상 인 줄 을 옮 겨 다 니 기(이렇게 하면 위의 숫자 270 과 작은 프로그램 블록 의 영향 을 제거 할 수 있 습 니 다).
np.nonzero()는 목록 요소 의 수치 가 0 이 아 닌 위 치 를 표시 합 니 다.첫 번 째 는 상단 의 높이 입 니 다.

다음은 상단 의 너비 값 을 가 져 옵 니 다.

#         
x_top = int(np.mean(np.nonzero(canny_img[y_top])))
여기 에는 여러 개의 수준 점 이 발견 되 었 기 때문에 마지막 에 평균 치 를 취한 다.
다음은 상대방 블록 아래 의 정점 위 치 를 확정 합 니 다.

작은 백 권 의 영향 을 뛰 어 넘 기 위해 정점 높이 에 80 개의 픽 셀 크기 를 더 했다.
그리고 픽 셀 값 이 0 이 아 닌 점 을 찾 을 때 까지 너비 값 이 변 하지 않 습 니 다.
사각형 의 아래 정점 좌 표를 얻 었 습 니 다.

#      ,    
y_bottom = y_top + 80
for row in range(y_bottom, H):
  if canny_img[row, x_top] != 0:
    y_bottom = row
    break
#         
x_center, y_center = x_top, (y_top + y_bottom) // 2
#              
cv2.circle(canny_img, (x_center, y_center), 33, (255, 0, 255), 2)
#        
cv2.namedWindow('result', 0)
cv2.resizeWindow('result', 400, 600)
cv2.imshow('result', canny_img)
#   
cv2.waitKey(0)
cv2.destroyAllWindows()
마지막 으로 상하 정점 의 좌 표를 통 해 사각형 의 중심 점 을 얻는다.

왼쪽 그림 은 가장자리 에서 원 도 를 감지 하고 오른쪽 그림 은 사각형 의 중심 점 을 찾 아 중심 점 을 원심 으로 동 그 란 그림 을 그립 니 다.
/02/점프 실현
현재 이전 템 플 릿 과 일치 하여 얻 은 작은 바둑 의 위 치 를 결합 하여 두 중심 거 리 를 계산 합 니 다.
세 가닥 의 사 현 오 를 그 으 면 두 중심의 거 리 를 얻 을 수 있다.
다음 그림 을 보면 한눈 에 알 수 있다.

점프 를 해 본 사람 은 모두 알 고 있 을 것 이다.서로 다른 거리 에 대해 우리 가 눌 러 야 할 시간 은 다르다.
따라서 거리 와 압력 시간 에 따라 관련 매개 변 수 를 설정 할 수 있 습 니 다.여 기 는 1.35 로 설정 합 니 다.
내 휴대 전화 에 완벽 하 게 맞 아 떨 어 졌 다.
마지막 으로 adb 명령 을 통 해 일정한 압력 시간 을 완성 하고'점프'자동 화 를 완성 합 니 다.
총결산
위 에서 말 한 것 은 편집장 님 께 서 소개 해 주신 OpenCV 테두리 검 측 입 니 다.여러분 께 도움 이 되 셨 으 면 좋 겠 습 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.
제때에 모두 에 게 회답 하 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!

좋은 웹페이지 즐겨찾기