Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

OpenCV를 사용하여 이미지의 가장자리를 감지하는 Python 프로그램

<시간/>

이 문제에서는 Python이 이미지 또는 비디오 파일의 가장자리를 감지하는 방법을 볼 것입니다. 이를 위해서는 OpenCV 라이브러리가 필요합니다. OpenCV 라이브러리는 주로 컴퓨터 비전용으로 설계되었습니다. 오픈 소스입니다. 원래 인텔에서 설계했습니다. 오픈 소스 BSD 라이선스에 따라 무료로 사용할 수 있습니다.

OpenCV 기능을 사용하려면 pip.를 사용하여 다운로드해야 합니다. OpenCV는 Numpy 모듈을 다운로드합니다. 그것도 필요할 것입니다.

sudo pip3 install opencv-python

입력으로 이 경우 하나의 비디오 파일을 사용했습니다. 웹캠을 사용하여 이 가장자리 감지 절차의 실시간 효과를 볼 수도 있습니다.

여기서는 비디오 파일을 사용하고 있습니다. 실제 이미지(동영상의 프레임)는 이렇습니다 -

<중앙> OpenCV를 사용하여 이미지의 가장자리를 감지하는 Python 프로그램

가장자리 감지는 어떻게 작동합니까?

가장자리를 감지하기 위해 픽셀의 밝기가 뚜렷하게 변화하는지 확인하는 몇 가지 수학적 관찰이 있습니다.

이미지의 회색조 버전에 대한 그라디언트를 찾아야 합니다. 컴퓨터 비전에서 픽셀이 검은색에서 흰색으로 이동할 때 양의 기울기로 표시됩니다. 흰색에서 검은색으로의 전환의 경우 음의 기울기입니다.

이미지의 파생물을 사용한 에지 감지

이미지는 매트릭스로 저장되며, 해당 매트릭스의 각 요소는 모든 픽셀에 대한 정보를 보유합니다. 미분을 찾으려면 Laplacian 연산자가 필요합니다. 따라서 Laplacian을 얻으려면 먼저 Sobel 도함수가 필요합니다. 이러한 Sobel 도함수는 이미지의 그라디언트 변형을 얻는 데 사용됩니다.

수평 소벨 도함수(Sobel X)

이 Sobel 도함수는 실제 이미지와 다른 행렬(커널이라고 함)의 컨볼루션을 통해 얻습니다. 커널은 간단한 경우를 위한 3x3 행렬입니다.

sobel()이라는 함수가 있습니다. . 이 함수를 사용하여 소벨 도함수를 찾을 수 있습니다. Sobel x를 얻으려고 할 때 y 부분은 0이어야 합니다.

예시 코드

import cv2
import numpy as np
capture = cv2.VideoCapture('sample_video.mp4') #Capture frames from video file.
while(capture.isOpened()): # Run the loop until the video ends
   ret, frame = capture.read() #Fetch the frames from video
   # Convert BGR color to (Hue Saturation Value) mode
   hsv_col = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
   # The Sobelx Method
   sobelx = cv2.Sobel(frame,cv2.CV_64F,1,0,ksize=5)
   cv2.imshow('SobelX',sobelx)
   k = cv2.waitKey(5) & 0xFF
   if k == 27: #27 is the ASCII for ESC key. When ESC is pressed, it will stop
      break
capture.release()
cv2.destroyAllWindows() #Clean memory after removing the windows

출력

<중앙> OpenCV를 사용하여 이미지의 가장자리를 감지하는 Python 프로그램

수직 소벨 파생 상품(Sobel Y)

유사하게 우리는 sobel() 함수를 사용하여 수직 소벨 도함수를 찾을 수 있습니다. 이 경우 x 부분은 0이 됩니다.

예시 코드

import cv2
import numpy as np
capture = cv2.VideoCapture('sample_video.mp4') #Capture frames from video file.
while(capture.isOpened()): # Run the loop until the video ends
   ret, frame = capture.read() #Fetch the frames from video
   # Convert BGR color to (Hue Saturation Value) mode
   hsv_col = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
   # The Sobely Method
   sobely = cv2.Sobel(frame,cv2.CV_64F,0,1,ksize=5)
   cv2.imshow('SobelY',sobely)
   k = cv2.waitKey(5) & 0xFF
   if k == 27: #27 is the ASCII for ESC key. When ESC is pressed, it will stop
      break
capture.release()
cv2.destroyAllWindows() #Clean memory after removing the windows

출력

<중앙> OpenCV를 사용하여 이미지의 가장자리를 감지하는 Python 프로그램

라플라시안 도함수

마침내 우리는 이미지의 라플라시안 도함수를 보게 될 것입니다. Laplacian()이라는 함수가 있습니다. 도함수를 구하는 데 사용됩니다.

예시 코드

import cv2
import numpy as np
capture = cv2.VideoCapture('sample_video.mp4') #Capture frames from video file.
while(capture.isOpened()): # Run the loop until the video ends
   ret, frame = capture.read() #Fetch the frames from video
   # Convert BGR color to (Hue Saturation Value) mode
   hsv_col = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
   # The Laplacian Method
   laplacian = cv2.Laplacian(frame,cv2.CV_64F)
   cv2.imshow('Laplacian',laplacian)
   k = cv2.waitKey(5) & 0xFF
   if k == 27: #27 is the ASCII for ESC key. When ESC is pressed, it will stop
      break
capture.release()
cv2.destroyAllWindows() #Clean memory after removing the windows

출력

<중앙> OpenCV를 사용하여 이미지의 가장자리를 감지하는 Python 프로그램