* 예수님의 사랑으로 축복합니다.


LabWindows/CVI에서 OpenCV 사용하기


허창원()


차례

개요

1. LabWindows/CVI 버전

2. OpenCV 버전

3. LabWindows/CVI의 include 경로 옵션

4. 테스트 프로그램 작성 및 테스트



개요

인텔(Intel)사에서 후원하는 오픈소스 컴퓨터 비전 라이브러리인 OpenCV를 LabWindows/CVI에서 사용하기 위해 테스트하던 중 몇가지 미리 알아두면 편리한 사항이 있어서 이렇게 글을 쓰게 되었습니다. LabWindows/CVI로 OpenCV를 이용하기 위한 분들을 위한 것일뿐 아니라 사실 저 자신을 위한 것이기도 합니다. 시간이 오래 지나고 나면, 저도 기억이 가물가물해져서 누군가에서 설명을 하려고 하면 뭔가를 빠트리곤 하기 때문입니다. 어쨌거나 제 글이 도움이 되실 분들이 있을 것이라고 믿고 시작합니다.


1. LabWindows/CVI 버전

이 글을 작성하는 날짜는 2014년 1월 2일입니다. 현재를 기준으로 NI LabWindows/CVI는 2013 버전이 나와 있습니다. 정확히 말해 LabWindows/CVI 2013 f1 Patch 버전입니다.



그림 1.1 LabWindows/CVI 2013 로고


그리고, 저는 예전에 수행한 프로젝트도 지원해야할 필요도 있어서 그림 1.2와 같이 여러 버전의 LabWindows/CVI를 설치해두고 적절한 버전을 선택하여 사용하고 있습니다.



그림 1.2 여러버전의 LabWindows/CVI가 설치되어 있는 환경


이번 테스트에서는 LabWindows/CVI 2010 sp1 버전부터 2013 버전까지 이용해보았습니다.


2. OpenCV 버전

이 글을 사용하기 전에 OpenCV Version 2.4.7.2 로 테스트하였는데, OpenCV 사이트에 방금 접속해보니 그저께 새로운 버전, Version 2.4.8 이 올라와있네요. 새로 다운로드 받아 글을 써 나가겠습니다.



그림 2.1 OpenCV 버전(2014-01-02 현재)


OpenCV v2.4.8 버전을 다운로드 받아서 임의의 폴더에 압축을 해제한 후에, 전체 파일들을 아래의 경로에 이동시켰습니다. 그림 2.2에서는 include 시킬 폴더를 열어둔 화면입니다.


D:\OpenCV\OpenCV_v2.4.8


그림 2.2 OpenCV 설치된 경로



3. LabWindows/CVI의 include 경로 옵션

LabWindows/CVI 2013 버전을 실행한 다음, 테스트를 위해 새 프로젝트 파일을 열어 저장합니다. 파일명은 LOCV_p042.prj 로 지정하였습니다. (참고한 책이름 약어와 페이지를 적절히 조합한 이름입니다)


그림 3.1에 보인 대로, CVI 프로젝트 창의 메뉴에서 Options - Environment 를 선택합니다. (저는 CVI 작업환경을 아래와 같이 사용합니다. 저처럼 사용하시려면, View - Workspace View Selection... 메뉴에서 Classic View를 선택하시면 됩니다.)


그림 3.1 LabWindows/CVI Environment 옵션 선택



그림 3.2 LabWindows/CVI의 Include Paths... 설정


그림 3.3에 보인대로 OpenCV의 include 폴더를 지정합니다. Browse 버튼을 눌러 해당 경로를 찾아가 선택하면 되겠습니다. 저는 "Switch Lists (F6)" 버튼을 눌러 현재 프로젝트에서만 이 include 환경이 적용되도록 하였습니다. (저처럼 이렇게 하면, 매번 새로운 OpenCV 프로젝트를 시작할 때마다 해주어야하는 번거로움이 있겠지만, 매번 기억을 새롭게 하는 데에 도움이 될 것같고, OpenCV 버전이 바뀌더라도 한번 더 챙겨볼 수 있을 것같아 저는 이렇게 하였습니다)


그림 3.3 OpenCV Include 폴더 경로 지정


4. 테스트 프로그램 작성 및 테스트

그림 4.1에는 테스트를 위한 소스 프로그램을 편집하여 보았습니다. 일반적으로 많이 소개되는 Visual C++의 예제와 달리 간단하게 하나의 파일로 테스트 예제를 구성할 수 있습니다. ANSI C 규칙에 충실한 LabWindows/CVI의 단순하고 간결한 장점이라고 저는 봅니다.


그림 4.1 OpenCV 를 이용한 이미지 파일 불러와서 보이는 예제


이미지로 소스를 보이면 타이핑하기 불편하실까봐 소스도 아래에 넣었습니다.


// LOCV_p042.c
// 사용법: LOCV_p042.exe <imagefile>
//
#include <ansi_c.h>
#include "opencv/highgui.h"

int main (int argc, char *argv[])
{
    if(argc > 1)    // 명령행 인자로 파일명이 지정되어야 함
    {
        IplImage* img;
       
        // 파일을 불러오고,
        img = cvLoadImage( argv[1], -1);     
   
        // 이미지를 표시할 창의 이름을 정하고
        cvNamedWindow("Example", CV_WINDOW_AUTOSIZE);  
   
        // 이미지를 보여주고,
        cvShowImage("Example", img);                   
       
        // 키 입력을 기다리고,
        cvWaitKey(0);                                  
   
        // 이미지를 해제한후
        cvReleaseImage(&img);                          
   
        // 창을 닫습니다.
        cvDestroyWindow("Example");                    
    }
    else    // 파일명을 명령행 인자로 주지 않았을 때...
    {
        printf("Command Line Argument required!");
        getchar();
    }
   
    return 0;
}


위와 같이 제대로 타이핑되었다면, Build - Build(Ctrl + M) 메뉴를 선택하여 Build 합니다. 그러면, 그림 4.2와 같이 에러가 날 것입니다.



그림 4.2 Build 시의 컴파일 에러


마지막 줄의 types_c.h 에서 생긴 에러로 인해 앞의 warning도 생긴 것입니다. 이 마지막줄을 더블클릭하면 그림 4.3과 같이 문제가 된 해당 소스 파일이 열립니다.



그림 4.3 문제가 된 types_c.h 헤더파일의 해당 라인


lrint() 라는 함수의 프로토타입이 제대로 선언되어 있지 않다는 에러인데, 이 문제에 대해 CVI 표준 include 파일들과 Visual C++의 표준 헤더파일들을 비교해 보는 등 여러가지를 시도한 끝에 문제가 된 문장을 아래와 같이 바꾸어버렸습니다. 즉, OpenCV의 types_c.h 헤더파일을 수정하였습니다.


return (int)(value > 0 ? value+0.5 : value-0.5);


그리하여, types_c.h 헤더파일이 그림 4.4와 같이 수정되었습니다.


그림 4.4 수정된 types_c.h 헤더파일


다시 빌드해보면, 이제는 Link 에러가 그림 4.5와 같이 나타납니다. (Compile 단계에서는 warning 정도가 나오는데, 살펴본 결과 무시해도 되겠습니다.)


그림 4.5 Link 에러


이것은 Library가 없어서 그런 것인데, 저는 정적 library보다는 DLL을 주로 이용할 것이기 때문에, 아래의 경로에서 Import Library를 CVI 프로젝트에 포함시킵니다. (이번 테스트에서는 아래의 두 library만 있으면 되므로...)


D:\OpenCV\OpenCV_v2.4.8\build\x86\vc12\lib


그림 4.6 LOCV_p042 프로젝트에 포함시킬 Import Library


이제 Build 해보니, 정상적으로 Build 되었습니다. 이제 실행을 위해 아래의 경로에서 해당 DLL을 실행 폴더로 복사해와야겠습니다.


D:\OpenCV\OpenCV_v2.4.8\build\x86\vc12\bin


그림 4.7 LOCV_p042.exe 실행을 위한 DLL


그리고, 불러올 이미지 샘플을 아래의 경로에서 실행 폴더로 복사해 옵니다.


D:\OpenCV\OpenCV_v2.4.8\sources\samples\c


그림 4.8 LOCV_p042.exe 실해시에 이용할 샘플 이미지 파일


이제 그림 4.9와 같이 실행에 필요한 파일들이 다 모인 것 같습니다.


그림 4.9 LOCV_p042.exe 실행 폴더


실행할 때 주의할 점은, 불러올 이미지 파일명을 명령행 인자로 주어야한다는 것입니다. LabWindows/CVI의 Run - Specify Executable and Command Line.... 메뉴에서 지정해도 되겠지만, 그냥 명령 프롬프트(cmd) 창을 열어서 그림 4.10과 같이 실행을 하였습니다.



그림 4.10 명령 프롬프트(cmd)에서 LOCV_p042.exe 실행하기


실행을 했더니, 그림 4.11과 같은 에러가 나타납니다. 헉.... MSCVP120.dll 이 무슨 파일인지 인터넷 검색을 해보니, Microsoft Visual Studio 2013 관련 DLL인 것 같습니다. Visual C++ 2013 Run-Time Engine이라고 보면 되겠습니다. (OpenCV v2.4.7.2와는 달리 v2.4.8은 VC++ 2013 버전으로 개발한 모양입니다.)



그림 4.11 Visual C++ Runtime 에러



Microsoft Download Center로 가서 "Visual Studio 2013용 Visual C++ 재배포 가능 패키지"를 다운로드 받아서 설치합니다. (저는 Windows 7 x64 버전을 사용하지만, Visual C++ 재배포 가능 패키지는 x86 버전을 설치하였습니다. OpenCV도 x86 버전을 이용하였습니다.)


그림 4.12에 다운로드 및 설치과정을 보였습니다.


http://www.microsoft.com/ko-kr/download/details.aspx?id=40784




그림 4.12 Microsoft Visual C++ 2013 재배포 가능 패키지 설치


이제 다시, 그림 4.10과 같이 실행했더니, 그림 4.13과 같이 cat.jpg 이미지 파일을 불러와서 창을 띄워 보여줍니다.



그림 4.13 LOCV_p042.exe 실행화면



이렇게 하여, LabWindows/CVI에서 OpenCV를 사용하는 첫과정을 살펴보았습니다. LabWindows/CVI 2010 sp1, 2012 sp1 버전에서도 문제없이 빌드되었고, 실행되었습니다.

단, LabWindows/CVI 9.0.1 버전에서는 문제가 발생하던데, 오래된 버전이라 문제를 해결하기 위해 더 이상 시도하지는 않았습니다.


본 글은 CVI정보나눔(www.cvi.kr)에도 좀더 다듬어서 올릴 예정입니다.

LabWindows/CVI로 OpenCV를 이용하는 모든 분들에게 좋은 일이 많이 있기를 바랍니다.


2014-01-02

허창원


'LabWindows/CVI' 카테고리의 다른 글

LabWindows/CVI에서 OpenCV 사용하기  (3) 2014.01.02
Posted by 허창원

댓글을 달아 주세요

  1. 르네상스맨 2014.02.03 16:30  댓글주소  수정/삭제  댓글쓰기

    안녕하세요~

    CVI정보나눔에서 많은 정보 얻고 있습니다.

    감사합니다^^

  2. 허창원 2014.02.15 11:58 신고  댓글주소  수정/삭제  댓글쓰기

    감사합니다, 르네상스맨님!
    관심 가져주시니 큰 힘이 됩니다.

  3. 손님 2015.11.06 18:15  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 위에 계시하신 CVI에서 LOCV 동작하는것 참고하셔 프로그램 테스트 하고있습니다.

    테스트 도중 질문이 있어서 글 남깁니다.

    저는 위에서 약간 수정하여 panel 을 만들고 command button을 추가 하여 button클릭시 파일 을 선택하게 하여 그 파일을 열도록 하였습니다.

    Example 이름의 새로운 창이 뜨고 동작을 잘 합니다.

    질문 내용은 새로운 창이 뜬 상태에서 Panel에 다른 기능들이 동작을 않합니다.

    창을 지우면 panel에 다른 기능들이 동작을 하고요...

    이런 경우 경험하신적 있으면 해결 방법좀 부탁드립니다.

    질문 내용을 다시 말씀드리면 창이 떠 있는 상태에서 panel의 button 등 다른 기능을 사용하는 방법입니다.

    // 키 입력을 기다리고,
    cvWaitKey(0);

    이 부분에서 멈춰 있어서 그런것인지 잘 모르겠습니다.

    감사합니다.