본문 바로가기

코딩/OpenCV35

[c++ opencv] haarcascades를 이용하여 얼굴인식하고 얼굴만 모자이크 처리하는 방법 본문 목표 머신러닝과 같이 영상인식의 사용이 부쩍 많아진 요즘 얼굴인식은 정말 흔하게 사용하는 기술이 되었다. B612 같은 카메라 보정 어플도 그렇고, 코로나 시국에 발열체크 하는 기계에서도 그렇고 정말 많이 사용하는 기술이다. 이러한 얼굴인식을 사용해보고, 모자이크 처리를 해보도록 한다. 키워드 : 얼굴인식, faceface_classifier, 모자이크처리 알아볼 함수 원형 - 함수 기능 ( Function Name ) face_classifier.detectMultiScale(grayframe, faces, 1.1, // increase search scale by 10% each pass 3, // merge groups of three detections CV_HAAR_FIND_BIGGEST_.. 2021. 3. 15.
[c++ opencv] Labeling(라벨링, 레이블링)으로 객체 카운팅하는 방법 본문 목표 영상처리를 하다보면 연속된 픽셀들이 이루는 그룹을 판단해야 할 상황이 있다. 이런 경우 대상에 이름을 붙여주는 작업이 라벨링 또는 레이블링이라 한다. (라벨링은 한국식 콩글리쉬인듯, 영문권에서는 레이블링 이라고 한다.) Opnecv를 사용하지 않고도 레이블링을 할 수 있지만, 원리를 알아보고 그 사용법을 알아보도록 한다. 키워드 : 라벨링, 레이블링, labeling, connectedComponents(), connectedComponentsWithStats() 레이블링( labeling ) 이란? 인접한 같은 값을 갖는 픽셀끼리 하나의 그룹으로 묶어주는 작업이다. 쉽게 말해서 이진화 이미지에서 경계를 이룬 영역에 이름(숫자)을 부여하는 작업이다. 왜 레이블링이 필요한가? 영상인식 과 영상처.. 2020. 12. 25.
[c++ opencv] 이미지서치 연산속도 향상, Template Matching 사용하기 #2 연산속도 빠르게 본문 목표 이전 포스트에서 이미지서치 Template Matching을 배웠었다. 이번에는 코딩에서 제일 중요한 연산속도 향상에 대해서 다뤄보도록 하겠다. 어떻게 하면 동일한 결과를 얻으면서도 연산속도를 빠르게 할 수 있는지 알아보자. 키워드 : 이미지서치, Template Matching, 템플릿매칭 알아볼 함수 원형 - 테플릿 매칭 ( matchTemplate ) matchTemplate(src, templ, result, 1); normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat() ); minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() ); matchTemplate( img, templ, resul.. 2020. 10. 25.
[c++ opencv] 이미지서치 기본사용법, Template Matching 사용하기 #1 기본사용 본문 목표 OpenCV를 다루다보면 이미지서치를 사용할 때가 온다. 자율주행 시스템에서도 표지판인식, 번호판 인식에 사용하기도 하고, 컴퓨터 화면에서도 이용하기도 한다. 또한 생산 공장등에서도 사용하기도 한다. 그만큼 중요한 내용인 만큼 어떻게 사용하는지도 알아보도록 하자. 키워드 : 이미지서치, Template Matching, 템플릿매칭 알아볼 함수 원형 - 테플릿 매칭 ( matchTemplate ) matchTemplate(src, templ, result, 1); normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat() ); minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() ); matchTempl.. 2020. 10. 25.
[C++ opencv] 웹캠으로 실시간 HSV 값 추출하기 본문 목표 OpenCV를 다루다 보면 색상 인식을 많이 하게 된다. 색상 인식을 하는데 있어서 RGB를 사용해야 할 때가 있고, HSV 색채널을 이용해야 할 때가 있다. RGB는 흰색과 검은색 또는 컴퓨터상의 색을 인식할 때 좋고, HSV 색채널은 실제 일상에서의 색을 인식할 때 좋다. 오늘의 목표는 내가 특정한 색을 인식하고 싶을때, 해당 색의 정보가 어떻게 되는지 OpenCV를 통해서 알아내보는 것이다. 키워드 : cvtColor, HSV 코드 테스트 결과 - CODE #include #include #include //#include #include #include #include using namespace std; using namespace cv; int main(int, char**) { /.. 2020. 10. 18.
[C++ opencv] 이미지에 텍스트 넣기 본문 목표 OpenCV를 다루다보면 결과창(LCD)에 원하는 정보를 표현해야 할 때가 있다. printf( ) 또는 cout 을 이용해서 콘솔창에 정보를 띄워도 되지만, 이런 경우 이미지 화면과 콘솔 화면을 둘 다 봐야 하기에 시선이 분산 된다. 따라서 결과창에 텍스트를 넣어서 확인할 수 있다면 굳이 콘솔창을 띄우지 않아도 될 것이다. 오늘은 결과 이미지에 원하는 텍스트를 출력하는 것을 다뤄보도록 하겠다. 키워드 : putText 알아볼 함수 원형 - 텍스트 삽입하기( putText ) Mat img; img = imread("text_test_1.jpg", 1); Mat img_out; img.copyTo(img_out); char mystr[30]; sprintf_s(mystr, "Bird"); pu.. 2020. 10. 17.
[C++ opencv] 허프변환 원 검출하는 방법, HoughCircles 본문 목표 영상처리에 있어서 원을 검출할 상황이 종종 발생한다. 이런 경우에 허프변환을 이용하여 원을 검출해낼 수 있다. OpenCV에서 어떻게 허프변환을 이용하여 원을 검출할 수 있는지 알아보자. 키워드 : HoughCircles 알아볼 함수 원형 - 허프변환 원 검출 ( HoughCircles ) vector circles; HoughCircles(img_houghC, circles, HOUGH_GRADIENT, 1, 100, 50, 35, 0, 0); HoughCircles( src, dst, method, dp, min_dist, parameter1, parameter2, min_Radius, max_Radius) ○ src : 입력할 이미지 변수, grayscale 의 이미지를 입력해야 함 ○ .. 2020. 7. 29.
[C++ opencv] 허프변환과 확률을 이용한 직선 검출하기, HoughLinesP 본문 목표 영상처리에 있어서 직선 검출이 필요한 상황이 있다. 이런 경우에 허프변환을 통해서 직선을 검출할 수 있는데, 여기에 확률을 더해서 계산할 수 있다. 기존의 허프변환 방식은 하나하나 다 해보느라 시간이 오래 걸리는 방식이었다면 확률을 이용하여 직선인 것들만 구하므로 보다 빠르다. 허프변환에 확률을 적용한 직선검출을 OpenCV 에서는 어떻게 사용하는지 알아보자. 키워드 : Hough transform line, HoughLinesP 알아볼 함수 원형 - 확률적용 허프변환 직선검출 ( HoughLinesP ) vector linesP; HoughLinesP(img_canny, linesP, 1, (CV_PI / 180), 50, 50, 10); HoughLines( src, dst, rho, th.. 2020. 7. 29.
[C++ opencv] 허프변환을 이용하여 직선 검출하기, HoughLines 본문 목표 영상처리에 있어서 직선 검출이 필요한 상황이 있다. 이런 경우에 허프변환을 통해서 직선을 검출할 수 있는데, OpenCV 에서는 어떻게 사용하는지 알아보자. 키워드 : Hough transform Line 알아볼 함수 원형 - 허프변환 직선 검출 ( HoughLines ) Mat img = imread("lane.png"); Mat img_gray; cvtColor(img, img_gray, COLOR_BGR2GRAY); Mat img_canny; Canny(img_gray, img_canny, 150, 255); vector lines; HoughLines(img_canny, lines, 1, CV_PI / 180, 150); Mat img_hough; img.copyTo(img_hough).. 2020. 7. 29.
[C++ opencv] 이미지의 pixel 데이터 접근하기, 색상 정보 확인하기 본문 목표 영상처리를 하다보면 영상의 pixel 데이터를 확인해봐야 할 때가 생기기 마련이다. OpenCV에서는 어떻게 pixel 데이터를 확인할 수 있는지 알아보자. 키워드 : at, ptr, data 알아볼 함수 원형 Mat::at - 행렬 좌표로 픽셀 데이터 접근 ( img.at(row, col) ) for (int row = 0; row < img.rows; row++) { for (int col = 0; col < img.cols; col++) { uchar b = img.at(row, col)[0]; uchar g = img.at(row, col)[1]; uchar r = img.at(row, col)[2]; printf("\t (%d, %d, %d)", r, g, b); } cout 2020. 7. 28.
[C++ opencv] HSV 색상 검출하기 본문 목표 영상처리를 하다보면 특정 물체의 색을 인식해야할 상황이 주어진다. 컴퓨터에서 다룰 수 있는 색 영역은 크게 RGB 와 HSV 가 있는데, RGB는 컴퓨터에 최적화 되어있고, HSV는 사람의 눈과 비슷하다. 물체의 색을 인식한다면 사람과 같은 방식인 HSV 색 영역을 사용해야 하는데, Opencv 에서 어떻게 HSV 색채널을 다룰 수 있는지 알아보자. 키워드 : inRange( ) , bitwise_and( ), HSV 알아볼 함수 원형 - 이중 임계값 처리 ( inRange ) Mat img = imread("balls.jpg"); Mat img_hsv; cvtColor(img, img_hsv, COLOR_BGR2HSV); Mat yellow_mask, yellow_image; Scalar l.. 2020. 7. 27.
[C++ opencv] 관심영역 Region of Interest (RoI) 사용 방법 본문 목표 영상처리에서 가장 중요한 것은 정확성과 처리속도라고 할 수 있다. 정확성을 높이기 위해서는 관찰하려는 대상에 초점이 맞춰져 있어야한다. 원하는 피사체(대상)를 따로 분리하여 영상처리를 하고 싶은 경우 사용하는 방법이 '관심영역 설정'이다. 영어로는 RoI(Region of Interest) 라고 부른다. 키워드 : rect, RoI 알아볼 함수 원형 - 관심영역 ( Roi ) Mat img = imread("Lenna.png", 1); Mat img_roi_1, img_roi_2; img_roi_1 = img(Rect(200, 200, 100, 100)); img_roi_2 = img(Rect(Point(300, 200),Point( 400, 300))); src( Rect( x, y, wid.. 2020. 7. 21.
[C++ opencv] 이미지에 원 그리기, circle( ) 본문 목표 이미지를 처리함에 있어서 사용자가 확인할 수 있어야 쉽게 코드를 개발할 수 있다. 원을 표현해야하는 경우 어떻게 원을 이미지에 그려넣을 수 있는지 알아보자. 키워드 : circle( ) 알아볼 함수 원형 - 원 그리기 ( circle ) Mat img = imread("lane.png", 1); Mat img_circle; img.copyTo(img_circle); circle(img_circle, Point(500, 100), 50, Scalar(255, 0, 255), 1, 8, 0); circle(img_circle, Point(100, 100), 100, Scalar(255,0,0), 1, 4, 0); circle(img_circle, Point(200, 300), 70, Scalar:.. 2020. 7. 21.
[C++ opencv] 이미지에 사각형 그리기, rectangle( ) 본문 목표 이미지를 처리함에 있어서 사용자가 확인할 수 있어야 쉽게 코드를 개발할 수 있다. 사각형을 표현해야하는 경우 어떻게 사각형을 이미지에 그려넣을 수 있는지 알아보자. 키워드 : rectangle( ) 알아볼 함수 원형 - 사각형 그리기 ( rectangle ) Mat img = imread("lane.png", 1); Mat img_rectangle; img.copyTo(img_rectangle); rectangle(img_rectangle, Rect(Point(200, 200), Point(300, 300)), Scalar(0, 0, 255), 1, 8, 0); rectangle(img_rectangle, Rect(400, 400, 100, 100), Scalar(0, 0, 255), 1, 8.. 2020. 7. 21.
[C++ opencv] 이미지에 선, 직선 그리기 본문 목표 이미지를 처리함에 있어서 사용자가 확인할 수 있어야 쉽게 코드를 개발할 수 있다. 직선을 표현해야하는 경우 어떻게 직선을 이미지에 그려넣을 수 있는지 알아보자. 키워드 : line() 알아볼 함수 원형 - 함수 기능 ( Function Name ) Mat img = imread("lane.png", 0); Mat img_line; img.copyTo(img_line); line(img_line, Point(200, 200), Point(200, 300), Scalar::all(255), 1, 8, 0); line(img_line, Point(200, 200), Point(200, 100), Scalar(105,200,100), 1, 8, 0); line( Input Output Array, p.. 2020. 7. 21.