티스토리 뷰


본 글은 C#, C, LabVIEW 기반의 공통된 내용입니다.



[IMAQ] 비전 함수 메모리 릭(Memory Leak) 이슈


IMAQ Dispose 함수는 IMAQ 함수들을 이용하여 사용한 이미지 관련 메모리 할당 부분을 해제해주는 기능을 합니다. 해제를 하기 위해서는 IMAQ 생성 및 파일 읽기등을 통해서 가져온 메모리 주소에 대한 정보가 필요합니다. 코드상에서 여러번의 이미지를 생성할 수 있기 때문에 이에 대한 정보는 모두 가지고 있어야 합니다. Dispose 함수의 경우 프로그램 상에서 이미지가 더이상 필요가 없는 경우에만 사용을 하는 것이 좋습니다. 


사용이 종료되고 Dispose를 하지 않았을 때는 사용자의 PC 메모리는 점점 늘어나는 것을 확인할 수 있는데 이는 Memory Leak에 대한 이슈가 아니라 이미 할당된 이미지가 해제되지 않고 추가적으로 생성이 되기 때문에 발생을 합니다. Dispose에 대한 글을 좀더 확인하고 싶다면 아래의 링크를 참고해주세요.


Dispose 함수의 내역(LabVIEW 도움말)



또한 Dispose를 할 때 주의를 해야하는 점이 있습니다. 사용자가 IMAQ 함수를 통해서 Overlay를 하거나, 파일에서 이미지를 가져오거나 할 때 함수 내부적으로 모두 메모리에 관련 이미지를 할당합니다. 따라서 관련 함수를 사용한 경우 모두 메모리에 대한 해제를 해주셔야 합니다.


위의 상황이 반복이 되면 개발자는 메모리 릭으로 착각을 할 수 있습니다. 따라서 아래의 이슈가 되는 함수를 통해서 메모리를 할당받았다면 모두 해제를 해주셔야 합니다. 이미지 관리를 위해서 알아야 하는 함수의 내역은 아래와 같습니다. 


1) IMAQ Create


이미지에 대한 메모리 할당을 생성하는 함수입니다. 이 함수가 호출되었을 때는 사이즈를 설정이 되지 않고 비어있습니다. Image의 타입을 RGB, 8-bit, 또는 16-bit등으로 설정할 수 있습니다. 


2) IMAQ SetImageSize 


이미지에 대한 메모리를 할당합니다. 이 함수는 이미지 사이즈를 할당하거나 이미지 크기를 변경할 때 사용이 됩니다. 


3) IMAQ Snap and Similar VIs


카메라로 부터 한장이 이미지를 얻어오는데 사용되는 함수입니다. 이미지에 대한 할당을 하지 않았다면, 이함수는 자동적으로 메모리를 할당하여 관련 데이터를 카메라로 부터 전달합니다. 


4) IMAQ ReadFile and Similar VIs


ReadFile 함수는 동적으로 파일을 통해서 읽기 원하는 이미지에 대한 버퍼사이즈를 할당합니다. 이미지 파일은 컬러이미지도 포함이 됩니다. 그러나 이미지가 8-bit monochrome이면 ReadFile 함수는 8-bit monochrome를 리턴하게 됩니다. 컬러 이미지를 읽어드릴 때는 RGB 이미지 타입을 선택해야 합니다. 


5) IMAQ Copy Image


파라미터로 전달받는 이미지를 복사하여 리턴합니다. 입력과 출력되는 이미지의 타입은 동일해야 합니다. 이 함수는 Border, Calibration 정보, Overlay등의 내역을 모두 출력에 복사합니다. 이 함수는 복사하기 때문에 기존의 이미지를 계속 사용할 수 있게 해줍니다. 


6) IMAQ Cast Image


하나의 이미지 타입에서 다른 타입으로 변화하는 역할을 합니다. 16 bit 이미지를 AutoThreshold를 하고 싶다면 이 이미지는 8bit로 변환이 되어야 합니다. 이때 이 함수를 사용할 수 있습니다. 


7) IMAQ Rotate and Similar VIs


입력되는 이미지를 돌리는 역할을 합니다. 출력에 대한 메모리 할당을 하지 않으면 VI는 원본 이미지의 메모리를 이용하게 됩니다. 따라서 원본의 이미지가 변경이 됩니다. 입력과 출력을 받는 다른 함수들은 기존의 원본을 수정합니다. 이미지 수정을 원하지 않는다면 출력 부분의 파라미터에 다른 이미지를 입력하면 됩니다. 


8) IMAQ GetImagePixelPtr


이미지의 메모리 할당 장소를 리턴받습니다. 이 함수는 이미지 데이터에 접근하기 위해서 포인터를 사용합니다. 이는 배열의 값을 전달하는 것보다 더 빠른 속도로 처리해줄 수 있게 합니다. 만약 포인터 값을 전달하게 되면, 픽셀의 왼쪽 상단의 포인터를 전달하고 이를 통해 데이터를 사용할 수 있습니다. 


9) IMAQ Dispose


이미지의 메모리 할당을 삭제합니다. 이 함수를 실행하고 나면 이미지에 대한 메모리 할당은 더이상 존재하지 않습니다. 만약 IMAQ Dispose 함수를 통해서 메모리를 해제하지 않는다면 IMAQ Create 함수를 실행할 때 마다 새로운 이미지에 대한 메모리 할당이 지속적으로 이루어질 것입니다. 이를 사용자는 메모리 릭이라고 생각하기도 합니다. 


일반적으로 IMAQ Create 함수는 이미지를 만들 때 모두 호출이 됩니다. 이미지에 대한 할당을 처리하고 난뒤 IMAQ SetImageSize를 통해서 특정 크기의 메모리를 할당을 할 수 있습니다. 또한 Snap 함수를 통해 동적으로 할당을 할 수도 있습니다. 이미지 처리가 종료된다면 IMAQ Dispose를 통해서 메모리를 해제해야합니다. 


10) IMAQ Overlay 


또한 Overlay 함수를 이용하게 되면 이 부분을 반드시 해제해주셔야 합니다. Overlay는 IMAQClearOverlay 함수를 통해서 없앨 수 있습니다. 이 함수를 통해서 해제해야 하는 함수들의 내역은 아래와 같습니다.


  • IMAQ Copy Overlay
  • IMAQ Overlay Arc
  • IMAQ Overlay Closed Contour
  • IMAQ Overlay Line
  • IMAQ Overlay Metafile
  • IMAQ Overlay Open Contour
  • IMAQ Overlay Oval
  • IMAQ Overlay Points
  • IMAQ Overlay Rect
  • IMAQ Overlay ROI
  • IMAQ Overlay Text


이 글에서는 IMAQ 함수의 메모리 관리 방법에 대해서 알아보았습니다.


이 글이 도움이 되셨나요?

그렇다면 아래의 그림을 클릭해주세요.




댓글