Canny Edge Detector를 구현하기 위해 필요한 이론과 OpenCV에서 제공하는 Canny 함수 사용방법을 다룹니다.
캐니 에지 디텍터(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