728x90
728x90
OpenCV ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์
- Sobel Derivatives
https://docs.opencv.org/master/d2/d2c/tutorial_sobel_derivatives.html - Laplace Operator
https://docs.opencv.org/master/d5/db5/tutorial_laplace_operator.html - Canny Edge Detector
https://docs.opencv.org/master/da/d5c/tutorial_canny_detector.html - Hough Circle Transform
https://docs.opencv.org/master/d4/d70/tutorial_hough_circle.html - Finding contours in your image
https://docs.opencv.org/master/df/d0d/tutorial_find_contours.html
Canny Edge Detector
Canny Edge Detection ์ ์๋์ ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
1๋จ๊ณ : ๋
ธ์ด์ฆ ์ ๊ฑฐ
- 5x5 ๊ฐ์ฐ์์ ํํฐ๋ฅผ ์ด์ฉํด ์ด๋ฏธ์ง์ ๋ ธ์ด์ฆ๋ฅผ ์ค์ฌ์ค๋ค.
2๋จ๊ณ : Gradient ๊ฐ์ด ๋์ ๋ถ๋ถ ์ฐพ๊ธฐ
- Sobel ์ปค๋์ ์ํ๋ฐฉํฅ, ์์ง๋ฐฉํฅ์ผ๋ก ์ ์ฉํด ๊ฐ ๋ฐฉํฅ์ gradient๋ฅผ ํ๋ํ๋ค. -
- ์ํ๋ฐฉํฅ์ gradient๋ฅผ Gx, ์์ง๋ฐฉํฅ์ gradient๋ฅผ Gy๋ผ๊ณ ํ ๋, G = |Gx| + |Gy|
3๋จ๊ณ : ์ต๋๊ฐ์ด ์๋ ํฝ์
์ ๊ฐ์ 0์ผ๋ก ๋ง๋ค๊ธฐ
- 2๋จ๊ณ๋ฅผ ๊ฑฐ์น ํ, ์์ง์ ๊ธฐ์ฌํ์ง ์์ ํฝ์ ์ ์ ๊ฑฐํ๊ธฐ ์ํด ์ด๋ฏธ์ง ์ ์ฒด๋ฅผ ์ค์บํ๋ค. -
- gradient ๋ฐฉํฅ์ ์ํ๋ฐฉํฅ์ด๊ณ A๋ ์์ง๋ฐฉํฅ์ ์์ง์์, B, C๋ gradient ๋ฐฉํฅ์ ๋์ฌ์๋ค.
- A์ง์ ์์ gradient ๊ฐ์ด B, C๋ณด๋ค ๊ฐ์ด ํฐ์ง ์๋์ง ์ฒดํฌํ๋ค.
- A์์์ ๊ฐ์ด ๊ฐ์ฅ ํฌ๋ฉด ๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ฐ์ 0์ผ๋ก ๋ง๋ ๋ค.
4๋จ๊ณ : Hyteresis Thresholding
3๋จ๊ณ๋ฅผ ๊ฑฐ์น ๊ฒ๋ค์ด ์ค์ ์์ง์ธ์ง ์๋์ง ํ๋จํ๋ ๋จ๊ณ
- Threshold ๊ฐ์ minVal, maxVal 2๊ฐ๋ฅผ ์ก๋๋ค.
- maxVal ๋ณด๋ค ๋์ ๋ถ๋ถ์ ํ์คํ ์์ง, minVal๋ณด๋ค ๋ฎ์ ๋ถ๋ถ์ ์์ง๊ฐ ์๋๋ผ๊ณ ํ๋จ
- minVal, maxVal ์ฌ์ด์ ์๋ ๊ฐ๋ค์ ์ด ํฝ์ ๋ค์ ์ฐ๊ฒฐ๊ตฌ์กฐ๋ฅผ ๋ณด๊ณ ์์ง์ธ์ง ์๋์ง ํ๋จ
- A๋ maxVal๋ณด๋ค ์์ ์์ผ๋ฏ๋ก ํ์คํ ์์ง
- B, C๋ minVal, maxVal ์ฌ์ด์ ์๋ ํฝ์
- B๋ ํ์คํ ์์ง์ ์ฐ๊ฒฐX ์์ง๊ฐ ์๋๋ผ๊ณ ํ๋จ. ์ ๊ฑฐํ๋ค.
- C๋ ํ์คํ ์์ง์ ์ฐ๊ฒฐO ์์ง๋ผ๊ณ ํ๋จํ์ฌ ๋จ๊ฒจ๋๋ค.
OpenCV - Canny ํจ์
static void CannyThreshold(int, void*)
{
blur( src_gray, detected_edges, Size(3,3) ); // minVal, maxVal
Canny( detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size );
dst = Scalar::all(0);
src.copyTo( dst, detected_edges);
imshow( window_name, dst );
}
OpenCV - Finding Contour ๊ด๋ จ ํจ์
cv2.findContours(thr, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
์ด ํจ์๋ ์๋ณธ ์ด๋ฏธ์ง๋ฅผ ๋ณ๊ฒฝ์ํค๊ธฐ ๋๋ฌธ์ ๋ณต์ฌ๋ณธ์ ๊ฐ์ง๊ณ ํจ์๋ฅผ ์ ์ฉํ๋ ๊ฒ์ด ์ข์
thresh : contour ์ฐพ๊ธฐ๋ฅผ ํ ์์ค ์ด๋ฏธ์ง. thresholding์ ํตํด ๋ณํ๋ ๋ฐ์ด๋๋ฆฌ ์ด๋ฏธ์ง์ฌ์ผํจ
cv2.RETR_TREE : contour ์ถ์ถ ๋ชจ๋
cv2.RETR_EXTERNAL : ์ด๋ฏธ์ง์ ๊ฐ์ฅ ๋ฐ๊นฅ์ชฝ์ contour๋ง ์ถ์ถ
cv2.RETR_LIST : contour ๊ฐ ๊ณ์ธต๊ตฌ์กฐ ์๊ด๊ด๊ณ๋ฅผ ๊ณ ๋ คํ์ง ์๊ณ contour๋ฅผ ์ถ์ถ
cv2.RETR_CCOMP : ์ด๋ฏธ์ง์์ ๋ชจ๋ contour๋ฅผ ์ถ์ถํ ํ, 2๋จ๊ณ contour ๊ณ์ธต ๊ตฌ์กฐ๋ก ๊ตฌ์ฑํจ
cv2.RETR_TREE : ์ด๋ฏธ์ง์์ ๋ชจ๋ contour๋ฅผ ์ถ์ถํ๊ณ contour๋ค๊ฐ์ ์๊ด๊ด๊ณ๋ฅผ ์ถ์ถํจ
cv2.CHAIN_APPROX_SIMPLE : contour ๊ทผ์ฌ ๋ฐฉ๋ฒ
cv2_CHAIN_APPROX_NONE : contour๋ฅผ ๊ตฌ์ฑํ๋ ๋ชจ๋ ์ ์ ์ ์ฅํจ
cv2_CHAIN_APPROX_SIMPLE : contour์ ์ํ, ์์ง, ๋๊ฐ์ ๋ฐฉํฅ์ ์ ์ ๋ชจ๋ ๋ฒ๋ฆฌ๊ณ ๋ ์ ๋ง ๋จ๊ฒจ๋
cv2_CHAIN_APPROX_TC39__1 : The-Chin ์ฐ๊ฒฐ ๊ทผ์ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํจ
cv2.drawContours(img, contours, -1, (0, 255, 0), 3)
์ฐ๋ฆฌ๊ฐ ์ฐพ์ contou๋ฅผ ์ค์ ๋ก ๊ทธ๋ฆฌ๋ ํจ์
img : contou๋ฅผ ๋ํ๋ผ ๋์ ์ด๋ฏธ์ง
contours : img์ ๊ทธ๋ฆด contour. ์ด ๊ฐ์ cv2.findContours() ํจ์์ 2๋ฒ์งธ ๋ฆฌํด ๊ฐ์ด๋ค.
-1 : img์ ์ค์ ๋ก ๊ทธ๋ฆด contour ์ธ๋ฑ์ค ํ๋ผ๋ฏธํฐ. ์ด ๊ฐ์ด ์์์ด๋ฉด ๋ชจ๋ contour๋ฅผ ๊ทธ๋ฆผ
(0, 255, 0) : contour ์ ์ BGR ์์๊ฐ. ์ฌ๊ธฐ์๋ Green ๊ฐ์ ๋ปํจ
1 : contour ์ ์ ๋๊ป
* OpenCV์์ Contour ์ฐพ๊ธฐ๋ ๊ฒ์ ์ ๋ฐฐ๊ฒฝ์์ ํฐ์ ๋ฌผ์ฒด๋ฅผ ์ฐพ๋ ๊ฒ๊ณผ ๋น์ทํ๊ธฐ ๋๋ฌธ์, Contour๋ฅผ ์ฐพ๊ณ ์ ํ๋ ๋์์ ํฐ์์ผ๋ก ๋ฐฐ๊ฒฝ์ ๊ฒ์ ์์ผ๋ก ๋ณ๊ฒฝํด์ผ ํจ
- 2020.12.06 ์์ (2018.02.14 ์ธ๋ฏธ๋ ์๋ฃ)
- ์ด๋ฏธ์ง ์ถ์ฒ OpenCV ์์
728x90
728x90