본문 바로가기

코딩/OpenCV35

[C++ opencv] "이미지 복사" 개념 이해하기 .copyTo 본문 목표 코드 개발을 하다보면 연산 처리에 쓰이는 변수 값이 다른 변수값에 영향을 줘야 할 때가 많다. 영상처리에 있어서도 그러한데, 쉽게 생각하다가는 큰 실수가 되고, 결과에 치명적인 문제를 안겨주게 된다. 주소값과 데이터 값을 통해 영상처리에서 이미지 변수를 어떻게 사용하여야 정확하게 사용하는 것인지 알아보자. 키워드 : .copyTo 알아볼 함수 원형 - 이미지 복사 ( .copyTo ) Mat img = imread("Lenna.png", 0); Mat img_copy; img.copyTo(img_copy); src.copyTo( dst ) : src 이미지를 dst 에 복사 ○ src : 복사 시킬 원본 이미지 ○ dst : 복사 되어 저장 될 이미지 변수 우선 .copyTo( ) 가 왜 필요.. 2020. 7. 21.
[C++ opencv] High pass filter (HPF)로 윤곽선 검출, edge detection 본문 목표 저번 포스터에서 Low pass filter를 다뤘고, 영상에서 노이즈 제거를 함을 알아봤다. 이번에는 비슷한 개념이면서 다른 High pass filter를 이해해보고, 어느 상황에서 사용하는지 알아보자. 키워드 : high pass filter, HPF, 고주파 통과 필터, 라플라시안, 라플라시안-가우시안, sobel 알아볼 함수 원형 - 고역주파수 통과 필터 ( High pass filter ) GaussianBlur(img, img_gaussian, Size(3, 3), 0, 0, 4); Sobel(img_gaussian, img_sobel_x, CV_8U, 1, 0, 3, (1.0), (0, 0), 4); Sobel(img_gaussian, img_sobel_y, CV_8U, 0, 1.. 2020. 7. 15.
[C++ opencv] low pass filters (LPF)로 노이즈 제거하기 본문 목표 영상처리에서 노이즈제거는 매우 중요하다. 앞선 포스트에서 평균필터(average filter)와 가우시안 블러(gaussian blur)를 다뤘었다. 이번에는 보다 전문적으로 노이즈 제거 방법에 대해서 알아보도록 한다. 그리고 영상처리에 있어서 low pass filter는 노이즈 제거라는 것을 이해한다. 키워드 : low pass filter, average filter, gaussian filter, median filter, bilateral filter 알아볼 함수 원형 - 필터 적용 ( filter2d ) blur(img, img_blur, Size(5, 5), Point(-1, -1), BORDER_REFLECT); GaussianBlur(img, img_gaussian, Size(.. 2020. 7. 15.
[C++ opencv] 이미지 사이즈 변경하기, resize( ) 함수 사용법 본문 목표 연산속도를 빠르게 하기위해서 RGB 색 채널보다는 Grayscale을 사용한다. 그런데 이보다 더 연산속도를 빠르게 할 수 있는 방법은 이미지 사이즈를 줄이는 것이다. opencv에서 제공하는 이미지 사이즈 변경 방법에 대해서 알아보자. 키워드 : resize , 보간법 알아볼 함수 원형 - 이미지 크기 변경 ( Resize ) ... Mat img = imread("Lenna.png"); img_small; resize(img, img_small, Size(200, 200)); ... resize( src, dst, Size(cols, rows) ) ○ src : 입력할 이미지 변수 ○ dst : 필터가 적용되어 저장될 이미지 변수 ○ Size(cols, rows) : 변환시킬 이미지의 크기.. 2020. 7. 14.
[C++ opencv] 이미지에서 경계선 검출하기, Edge detection 본문 목표 Color 이미지의 Grayscale 로의 변환, 노이즈 제거와 이진화, 이 모든 과정은 오늘 다룰 경계선 검출을 위해서 선행되었어야 할 필수 과정이었다. 영상인식에서 경계선 검출이 되어야 컴퓨터가 물체를 인식하고 처리할 수 있다. 전문 용어로는 Edge detection 이라고 한다. 오늘은 이 경계선 검출 방법에 대해서 알아보고, OpenCV에서 어떻게 사용하는지 다뤄보도록 하겠다. 키워드 : Edge detection, Canny, 경계선 검출 알아볼 함수 원형 - 경계선 검출, 캐니 알고리즘 ( Edge_detection, Canny algorithm ) ... Mat img = imread("Lenna.png", 0);//이미지를 grayscale로 불러옴 Mat img_edge; C.. 2020. 7. 4.
[C++ opencv] opening, closing 기법 사용하여 경계 확실히 하기 본문 목표 저번시간에 침식연산(Erosion) 과 팽창연산(Dilation) 에 대해서 알아보았었다. https://diyver.tistory.com/61 [C++ opencv] erode, dilate 사용하여 물체 명확하게 하기 본문 목표 이 전까지 grayscale 과 threshold 에 대해서 배웠었다. 이제 노이즈를 제거함에 있어서 획기적인 방법 중 하나인 erode 또는 dilate 기법에 대해서 알아보도록 하자. Erode 와 Dilate 연산을 모폴�� diyver.tistory.com 이번에는 그 두가지 연산을 혼합하는 새로운 기법을 알아보도록 한다. opening 과 closing 기법인데, 말 그대로 열어주고 닫아주는 작업이다. 무슨 소리인지 이해 안되는 것이 당연하다. openin.. 2020. 7. 3.
[C++ opencv] erode, dilate 사용하여 물체 명확하게 하기 본문 목표 이 전까지 grayscale 과 threshold 에 대해서 배웠었다. 이제 노이즈를 제거함에 있어서 획기적인 방법 중 하나인 erode 또는 dilate 기법에 대해서 알아보도록 하자. Erode 와 Dilate 연산을 모폴로지 기법이라고도 한다. erode 를 해석하면 "침식시키다" 또는 "약화시키다" 라는 뜻을 가지고 있다. erosion 이라고도 한다. 그저 erode 의 명사일 뿐이다. dilate 를 해석하면 "확장하다" 또는 "키우다" 라는 뜻을 가지고 있다. dilation 이라고도 한다. 역시 명사형일 뿐이다. 이진화 된 영상에서 사용자가 중요하게 취급하는 것이 object 인데, object를 1 (white) 로 취급할 것인지, 0 (black) 으로 취급할 것인지에 따라서.. 2020. 7. 1.
[C++ opencv] 이중 임계값 처리, double thresholding, inRange() 본문 목표 저번 포스트에서 Thresholding 에 대해서 알아봤다. Thresholding을 하는 이유는 내가 명확하게 보고 싶은 것만 보면서 이미지의 크기를 작게하고, 데이터를 단순화해서 연산처리 속도에서 이득을 얻기 위함이었다. 하지만 저번 포스트에서 배우기로는 살짝 아쉬운 부분은 하나의 임계값을 기준으로 잡아서 극과 극으로 데이터를 처리했었던 것이라 아쉬움이 있을 수 있다. 왜냐하면 야외에서 카메라를 사용해 인물을 찍었다 했을 때, 바닥은 비교적 어둡고, 하늘이 찍혔으면 그 부분은 밝을 것이다. 근데 내가 원하는 것은 그 중간에 있는 object 의 데이터일 경우에는 어떻게 해야 좋을지 고민이 될 것이다. 이런 애매한 상황에서 사용할 수 있는 것이 double thresholding 이다. op.. 2020. 7. 1.
[C++ opencv] Thresholding 임계값 처리로 binary 이미지 만들기 본문 목표 영상처리에 있어서 제일 중요한 건 처리 속도이다. 여태 언급했던 노이즈 제거 및 grayscale 사용은 다 처리 속도 때문이었다. 처리속도가 빨라야 여러장을 처리할 수 있고, 여러장을 처리해야 정확도가 올라간다. grayscale은 0~255 까지 값을 저장하는 8 bit 크기를 가지고 있는데, 이제 여기서 더 속도를 빠르게 하기 위해서는 2 bit 크기를 다뤄야 한다. 그게 바로 binary 이미지 이다. 회색의 이미지에 0~255 사이의 값을 기준으로해서 기준 값(임계 값) 이상은 1(white), 이하는 0 (black) 으로 처리하는 방법을 사용한다. 이렇게 binary 이미지로 만드는 작업을 '이진화' 라고 한다. 연산 처리를 빠르게 하고 정확하게 하기위해 사용하므로, 꼭 알아야 하.. 2020. 6. 30.
[C++ opencv] 가우시안 필터 vs 평균 필터, 노이즈제거 승자는? 본 블로그에서 가우시안 필터와 평균 필터 사용법을 전부 다루었다. 그러면서 사용하는 목적이 다르다고 했었고, 분명 둘 사이에 시간차이가 있다고 했었다. 오늘은 그 차이를 확인해보는 시간을 가져보도록 하겠다. https://diyver.tistory.com/60 [C++ opencv] 평균필터 적용하여 노이즈 제거하기 average filter, filter2d() 본문 목표 영상처리에 있어서 제일 중요한 것들 중 하나는 당연 '노이즈 제거' 이다. 노이즈 제거 방법에는 정말 여러가지가 있지만, 제일 쉬운 방법은 blur 처리를 하는 것이다. blur 처리란 영상�� diyver.tistory.com [평균 필터 포스트 보러가기] https://diyver.tistory.com/67 [C++ opencv].. 2020. 6. 30.
[C++ opencv] 가우시안 필터로 노이즈 제거하기 gaussian filter, gaussian blur() 본문 목표 영상처리에서 '노이즈 제거'의 중요성은 80%를 차지한다고해도 과언이 아니다. 노이즈 제거의 방법에는 여러가지가 있겠지만, 가장 쉽게 하는 방법은 영상을 흐리게 하는 것이다. 그 중에서 오늘은 '가우시안 필터' 또는 '가우시안 블러'를 알아보도록 한다. 이 방법은 중앙값에 가중치를 더 주고 주변은 더 흐리게 한다고 보면된다. 키워드 : 가우시안 필터, 가우시안 블러, Gaussian blur 알아볼 함수 원형 - 가우시안 필터 적용한 블러처리 ( Gaussian Blur ) ... Mat img = imread("Lenna.png", 0);//이미지를 grayscale로 불러옴 Mat img_blur; GaussianBlur(img, img_blur, Size(7, 7), 0); ... Gau.. 2020. 6. 30.
[C++ opencv] 평균필터 적용하여 노이즈 제거하기 average filter, filter2d() 본문 목표 영상처리에 있어서 제일 중요한 것들 중 하나는 당연 '노이즈 제거' 이다. 노이즈 제거 방법에는 정말 여러가지가 있지만, 제일 쉬운 방법은 blur 처리를 하는 것이다. blur 처리란 영상을 흐리게하는 방법이다. OpenCV에서는 filter2D( ) 라는 함수가 있다. 이번에는 filter2D( ) 함수를 이용해서 영상을 blur 처리하는 방법을 알아본다. 키워드 : average filter, filter2d(), 평균필터, zero padding, mirror padding 평균필터 - 원리 이해 필터는 말 그대로 걸러주는 또는 처리를 해주는 것이다. 그러니 평균필터란 말 그대로 평균값을 이용한 필터링 방식이다. 여기에는 커널 또는 마스크 크기가 필요하다. (커널은 마스크 크기에 계산 .. 2020. 6. 26.
[C++ opencv] 효율적인 Histogram 이용한 이미지 밝기 조절 본문 목표 이미지의 Histogram 정보를 통해서 이미지의 밝기를 효과적으로 조절할 수 있다. OpenCV 에서도 해당 기능을 지원하는데, 이를 적용해보도록 한다. 키워드 : equalizeHist, Histogram equalization, 히스토그램 equalizeHist 히스토그램 - 원리 이해 히스토그램은 이미지의 밝기 값이 0~255 까지 있을 때, 픽셀들이 얼마나 그 값들을 갖고 있는지 나타내주는 그래프 이다. 예를 들면, 위와 같이 a 라는 이미지의 픽셀들 값이 행렬처럼 존재한다고 하면 오른쪽 그래프처럼 10의 값을 갖고 있는 픽셀 6개, 20의 값을 갖고 있는 픽셀 4개, 50의 값을 갖고있는 픽셀 7개, 90의 값을 갖고있는 픽셀 3개 로 나타낼 수 있다. 이런 히스토그램을 이미지에 적.. 2020. 6. 25.
[C++ opencv] 가장 쉽게 이미지 밝기 조절 하는 방법 본문 목표 OpenCV를 사용해서 영상처리를 할 때, 전에도 말했지만 무조건 흑백(grayscale) 이미지에서 연산을 처리해야 한다고 했다. 그 이유로는 연산처리 속도가 빨라지고 명확하게 할 수 있으므로, 오히려 정확도가 올라간다고 할 수 있다. 아무튼 이번에는 grayscale 이미지에서 밝기를 조절하는 방법을 알아보도록 한다. 키워드 : 사칙연산 ( + , - , * , / ) 원리 원리는 단순하다. grayscale은 0~255 의 값을 갖고있고, 이는 픽셀의 밝기 정도를 나타낸다. (1,1) 좌표의 픽셀의 밝기 값이 50 인데, 100으로 증가시키려면 어찌해야될지 생각해보자. 그러면 가장 단순하게 50만큼을 더해도 되고, 값을 2배로 증가시켜도 된다. 이미 초등학교를 다 뗏다면 방법은 다 알고 .. 2020. 6. 25.
[C++ opencv] 동영상 불러오기 VideoCapture() 본문 목표 OpenCV 를 사용하다 보면, 웹캠으로 실시간 영상을 받아와서 영상처리를 해야할 때도 있지만, 저장되어 있는 동영상 파일에서도 영상처리를 필요로 할 때가 많다. 이번에는 동영상 파일에서 프레임을 추출해 연산처리를 할 수 있는 방법을 알아본다. 키워드 : VideoCapture 알아볼 함수 원형 - 동영상 캡쳐 또는 불러오기 ( VideoCapture ) #include ... VideoCapture cap("test.mp4"); if (!cap.isOpened()) { printf("Can't open the video"); return -1; } ... VideoCapture '변수 이름'( "동영상 이름" ) : '변수 이름'은 "동영상 이름"에 해당하는 동영상 화면(frame)을 읽어온.. 2020. 6. 24.