반응형


Canny Edge Detector를 구현하기 위해 필요한 이론과 OpenCV에서 제공하는 Canny 함수 사용방법을 다룹니다.




  1. 캐니 에지 디텍터(Canny Edge Detector) 이론


     2. OpenCV Canny 함수


         2-1. Python 기본 예제


                트랙바 사용 예제


         2-2. C++ 기본 예제


                트랙바 사용 예제


     3. 참고




2018. 11. 14. 최초 작성.



1. 캐니 에지 디텍터(Canny Edge Detector) 이론




2. OpenCV Canny 함수

OpenCV에서는 하나의 함수 Canny만 호출하면 캐니 에지를 얻을 수 있습니다.


2-1. Python 기본 예제


img_canny = cv2.Canny(image, threshold1, threshold2, edges=None, apertureSize=None, L2gradient=None)


  • 첫번째 아규먼트 image는 입력 이미지입니다.

  • 두번째, 세번째 아규먼트 threshold1, threshold2는 최소 스레숄드와 최대 스레숄드입니다.

  • 네번째 아규먼트 edges에 Canny 결과를 저장할 변수를 적어줍니다.  파이썬에선 Canny 함수 리턴으로 받을 수 있기 때문에 필요없는 항목입니다.

  • 다섯번째 아규먼트 apertureSize는 이미지 그레디언트를 구할때 사용하는 소벨 커널 크기입니다. 디폴트는 3입니다.

  • 여섯번째 아규먼트 L2gradient가 True이면 그레디언트 크기를 계산할 때 sqrt{(dI/dx)^2 + (dI/dy)^2}를 사용합니다.

False라면 근사값인 |dI/dx|+|dI/dy|를 사용합니다.  디폴트값은 False입니다.



import cv2


img_gray = cv2.imread('house.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow("Original", img_gray)

img_canny = cv2.Canny(img_gray, 50, 150)
cv2.imshow("Canny Edge", img_canny)

cv2.waitKey(0)
cv2.destroyAllWindows()



트랙바 사용 예제


import cv2


def nothing():
   pass



img_gray = cv2.imread('house.jpg', cv2.IMREAD_GRAYSCALE)


cv2.namedWindow("Canny Edge")
cv2.createTrackbar('low threshold', 'Canny Edge', 0, 1000, nothing)
cv2.createTrackbar('high threshold', 'Canny Edge', 0, 1000, nothing)

cv2.setTrackbarPos('low threshold', 'Canny Edge', 50)
cv2.setTrackbarPos('high threshold', 'Canny Edge', 150)

cv2.imshow("Original", img_gray)

while True:

   low = cv2.getTrackbarPos('low threshold', 'Canny Edge')
   high = cv2.getTrackbarPos('high threshold', 'Canny Edge')

   img_canny = cv2.Canny(img_gray, low, high)
   cv2.imshow("Canny Edge", img_canny)

   if cv2.waitKey(1)&0xFF == 27:
       break


cv2.destroyAllWindows()




..


..


2-2. C++ 기본 예제


void cv::Canny(InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize = 3, bool L2gradient = false )


  • 첫번째 아규먼트 image는 입력 이미지입니다.

  • 두번째 아규먼트 edges에 Canny 결과를 저장할 변수를 적어줍니다.

  • 세번째, 네번째 아규먼트 threshold1, threshold2는 최소 스레숄드와 최대 스레숄드입니다.

  • 다섯번째 아규먼트 apertureSize는 이미지 그레디언트를 구할때 사용하는 소벨 커널 크기입니다. 디폴트는 3입니다.

  • 여섯번째 아규먼트 L2gradient가 True이면 그레디언트 크기를 계산할 때 sqrt{(dI/dx)^2 + (dI/dy)^2}를 사용합니다.

False라면 근사값인 |dI/dx|+|dI/dy|를 사용합니다.  디폴트값은 False입니다.


#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>

using namespace cv;


Mat src_gray;
Mat dst, detected_edges;

int lowThreshold = 50;
int highThreshold = 150;


int main(int argc, char** argv)
{

Mat src = imread("house.jpg", IMREAD_COLOR); // Load an image
if (src.empty())
{
std::cout << "Could not open or find the image!\n" << std::endl;
std::cout << "Usage: " << argv[0] << " <Input image>" << std::endl;
return -1;
}

cvtColor(src, src_gray, COLOR_BGR2GRAY);
blur(src_gray, detected_edges, Size(3, 3));
Canny(detected_edges, detected_edges, lowThreshold, highThreshold, 3);

namedWindow("Canny Edge", WINDOW_AUTOSIZE);
imshow("Canny Edge", detected_edges);


waitKey(0);
return 0;
}



트랙바 사용 예제


#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>

using namespace cv;



Mat src_gray;
Mat dst, detected_edges;

int lowThreshold = 50;
int highThreshold = 150;


static void CannyThreshold(int, void*)
{
blur(src_gray, detected_edges, Size(3, 3));
Canny(detected_edges, detected_edges, lowThreshold, highThreshold, 3);

imshow("Canny Edge", detected_edges);
}


int main(int argc, char** argv)
{

Mat src = imread("house.jpg", IMREAD_COLOR); // Load an image
if (src.empty())
{
std::cout << "Could not open or find the image!\n" << std::endl;
std::cout << "Usage: " << argv[0] << " <Input image>" << std::endl;
return -1;
}


cvtColor(src, src_gray, COLOR_BGR2GRAY);

namedWindow("Canny Edge", WINDOW_AUTOSIZE);
createTrackbar("Min Threshold:", "Canny Edge", &lowThreshold, 1000, CannyThreshold);
createTrackbar("Max Threshold:", "Canny Edge", &highThreshold, 1000, CannyThreshold);
CannyThreshold(0, 0);

waitKey(0);
return 0;
}



3. 참고

https://docs.opencv.org/3.4.3/da/d22/tutorial_py_canny.html


https://docs.opencv.org/3.4.3/da/d5c/tutorial_canny_detector.html

반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts