python.을 활용하여 개발을 진행하던 중 Edge device를 사용하면서 문제가 발생했다 

속도가 너무 느리고 메모리가 부족하다는 점이였다. 

그래서 C++을 활용하여 개발을 진행하고자 이전에 python으로 진행했던 opencv 예제를 C++로 변환하여 다시 진행하려한다. 

2021.06.23 - [Machine Learning/Computer Vision] - (1) OpenCV python - 기초 ( imread, imshow, imwrite, cvtColor, resize, waitkey, destroyAllWindows)

 

(1) OpenCV python - 기초 ( imread, imshow, imwrite, cvtColor, resize, waitkey, destroyAllWindows)

CNN 모델에 학습을 시키기 전 하고자 하는 목표에 맞게 이미지를 전처리하여 학습을 시키면 더 좋은 효과를 볼 수 있다. 이미지에서 필요없는 부분이 있는지, 특정 영역만을 추출해도 되는지 개

house-of-e.tistory.com

 

 

1. cv::imread 

string img_path = "asd";
Mat img = imread(img_path, IMREAD_COLOR);
  • 지정된 경로에 이미지를 읽어오는 함수이다 
  • 파라미터 - (const cv::String &filename, int flags =1 ) 
  • 첫번째 파라미터는 파일 이름으로 String형태의 문자열을 입력받는다 
  • 두번째 파라미터는 load할 color의 종류로 cv:: 에 여러가지 종류의 color type이 enum으로 정의되어있다
  • enum  ImreadModes {
    IMREAD_UNCHANGED=-1, 
    IMREAD_GRAYSCALE = 0, 
    IMREAD_COLOR = 1 // 기본값 
    ....
    }

2. cv::imshow

imshow("window_name", img);
  • 설정한 Window name을 가지는 창을 띄운다 
  • 파라미터 - (const cv::String &winname, cv::InputArray mat) 
  • 첫번째 파라미터는 생성할 윈도우의 이름으로 String형태로 문자열을 입력받는다 
  • 두번째 파라미터는 윈도우에 표시할 이미지 데이터로cv::InputArray형태로 입력받는다 

3. cv::waitKey

waitKey(0)
  • 사용자의 키 입력을 설정한 시간만큼 대기한다. 만약 0이면 무한대로 대기한다 
  • 파라미터 - (int delay=0) 
  • 첫번째 파라미터는 대기할 시간을 의미한다 단위는 milliseconds 이다 

4. cv::cvtColor : header -> (opencv2/opencv.hpp)

Mat grayImage;
cvtColor(img, grayImage, COLOR_BGR2GRAY);
Mat HSVImage; 
cvtColor(img, grayImage, COLOR_BGR2HSV);

  • 파라미터 - (cv::InputArray src, cv::OutputArray dst, int code, int dstCn = 0 ) 
  • 첫번째 파라미터는 변경을 하려는 이미지 
  • 두번째 파라미터는 변경한 결과를 저장할 변수 
  • 세번째 파라미터는  변경을 할 색상이다. enum으로 cv::ColorConversionCodes에 작성되어있다 
  • 네번째 파라미터는 결과물의 차원 수이다. 기본값은 0으로 0일시 원본이미지와 코드에서 자동적으로 차원이결정된다  

5. cv::resize 

Mat resizedImg; 
resize(img, resizedImg, Size(640, 640));
  • 파라미터 - (cv::InputArray src, cv::OutputArray dst, cv::Size dsize, double fx =(0.0), double fy = (0.0), int interpolation = 1 ) 
  • 세번째 파라미터는 변경하고자 하는 크기이다. cv::Size형태로 전달해야한다 
  • 네번째 파라미터는 수평(x축)에 적용되는 배율의 값이다 
  • 다섯번째 파라미터는 수직(y축)에 적용되는 배율의 값이다
  • 여섯번째 파라미터는 사용할 보간법의 종류를 설정할 수 있다. enum으로 InterpolationFlags에 정의되어있다

 

CNN 모델에 학습을 시키기 전 하고자 하는 목표에 맞게 이미지를 전처리하여 학습을 시키면 더 좋은 효과를 볼 수 있다. 

이미지에서 필요없는 부분이 있는지, 특정 영역만을 추출해도 되는지 개발자의 주관적 생각으로 판단하여야 한다. 

 

여기서 주관적이라는 말이 매우 거슬리지만 이미지란 참 복잡하다. 

 

만약 사람을 검출하고 싶은데 사람의 머리카락이 검은색이라 검은색만을 추출했더니 옆에 있던 맨홀이 나온다던지 할 수 있다. 

 

나도 computer vision에 대하여 잘 알지 못하지만 이제 시작함으로써 내용정리를 시작한다. 

 

 

1. imread

image = cv2.imread("FILE_PATH", cv2.IMREAD_COLOR)

  • imread = image read 이미지를 읽는 함수이다 
  • 첫 파라미터로 파일의 경로(image.jpg)를 입력하고 두 번째 파라미터로 어떤 색상으로 읽어올 건지에 대해 입력한다. 
    • cv2.IMREAD_COLOR : 이미지 파일을 Color로 읽어들입니다. 투명한 부분은 무시되며, Default값입니다.
    • cv2.IMREAD_GRAYSCALE : 이미지를 Grayscale로 읽어 들입니다. 실제 이미지 처리 시 중간단계로 많이 사용합니다.
    • cv2.IMREAD_UNCHANGED : 이미지파일을 alpha channel까지 포함하여 읽어 들인다. 하지만 이미지에 alpha channel에 대한 정보가 있어야 다르다 위에 사진과 같이 COLOR와 UNCHANGED가 똑같다

 

2. imshow, waitKey, destroyAllWindows

cv2.imshow("window_name", image)
key = cv2.waitKey(0)
cv2.destroyAllWindows()
  • imshow = image show 이미지를 윈도우 창에 보여주는 함수이다
  • 첫 파라미터로 띄어질 윈도우의 이름을 설정하고 두 번째 파라미터로 어떤 이미지를 띄울것인지 입력한다
  • waitKey와 destroyAllWindows 는 함께 쌍으로 자주 쓰이는 함수이다. waitKey는 사용자의 키보드 입력이 올때까지 대기하고 destroyAllWindows는 Opencv에서 띄운 모든 윈도우를 종료한다
  • 위의 코드를 보면 imshow 이후 cv2.waitKey(0)에 의해서 그 다음 문단으로 가지않고 sleep()처럼 대기된다. 여기서 waitKey의 함수안에 파라미터로 0이 있는데 이것은 무한대로 기다린다는 의미이다. 만약 사용자의 키보드 입력이 들어오면 waitKey 함수는 끝나게되고 뒤에있는 destroyAllWindows 함수에 의해 띄어졌던 이미지가 종료된다

 

3. imwrite

cv2.imwrite("test.jpg", image)

  • imwrite = image write 이미지를 저장하는 함수이다.
  • 첫 파라미터로 파일이 저장될 경로(test.jpg)를 설정한다 두 번째 파라미터로 저장할 이미지변수를 입력한다.

 

4. cvtColor

image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

  • cvtColor = convert color 이미지의 색상을 변환시키는 함수이다. 
  • 첫 파라미터로 변경할 이미지변수를 입력하고 두 번째 파라미터로 변경할 색상을 입력한다 
  • 변환 가능한 색상 종류에는 BGR2RGB, HSV, GRAY, LAB, LUV, XYZ 등 여러가지가 존재한다 

 

5. resize

image = cv2.resize(image,(608,608))

  • resize = 말그대로 사이즈를 변경한다 
  • 첫 파라미터로 변경할 이미지변수를 입력하고 두 번쨰 파라미터로 변경할 사이즈를 tuple형태로 입력한다
  • 사이즈를 더 작게, 더 크게 변경이 가능하다 하지만 원본의 비율과 다르게 변환하면 형태가 변경될 수 있고 더 작게 변경한다면 비율이 안맞는 부분에 자동으로 padding이 들어가게 된다

 

 

이번에는 기초적으로 이미지를 읽고 이미지 색을 변경하는 법을 정리하였다 

다음에는 numpy를 이용해서 이미지를 합쳐서 보는 법과 간단한 이미지 처리 기법에 대하여 정리하겠다

+ Recent posts