증상: 


잘 사용하고 있던 프로젝트가 어느 순간 갑자기 링크 에러로 빌드가 실패했다.


컴파일이 끝난 후 링킹 과정에서 한참 동안 응답이 없기 때문에 문제 파악이 힘들었다.


1>------ 빌드 시작: 프로젝트: XXXXXXXX, 구성: Debug Win32 ------

1>  LINK : F:\XXXX\...\XXXX.exe을(를) 찾을 수 없거나 마지막 증분 링크에 의해 빌드되지 않았습니다. 전체 링크를 수행하고 있습니다.

1>

1>LINK : fatal error LNK1000: Internal error during IMAGE::Pass1

1>

1>    Version 14.00.23918.0

1>

1>    ExceptionCode            = C0000006

1>    ExceptionFlags           = 00000000

1>    ExceptionAddress         = 602FDBE0 (602F0000) "C:\WINDOWS\SYSTEM32\VCRUNTIME140.dll"

1>    NumberParameters         = 00000003

1>    ExceptionInformation[ 0] = 00000000

1>    ExceptionInformation[ 1] = FEA18AEA

1>    ExceptionInformation[ 2] = C0000185

1>

1>  CONTEXT:

1>    Eax    = FEA18B26  Esp    = 0019E790

1>    Ebx    = 0019E7E4  Ebp    = 0019E7B4

1>    Ecx    = 0000003C  Esi    = FEA18AEA

1>    Edx    = 00000001  Edi    = 0019E7E4

1>    Eip    = 602FDBE0  EFlags = 00010202

1>    SegCs  = 00000023  SegDs  = 0000002B

1>    SegSs  = 0000002B  SegEs  = 0000002B

1>    SegFs  = 00000053  SegGs  = 0000002B

1>    Dr0    = 00000000  Dr3    = 00000000

1>    Dr1    = 00000000  Dr6    = 00000000

1>    Dr2    = 00000000  Dr7    = 00000000

========== 빌드: 성공 0, 실패 1, 최신 0, 생략 0 ==========



구글링을 해 보니 한 때 구버전 비주얼스튜디오 자체 버그가 있어서 핫픽스를 통해 해결이 가능했던 것으로 보였다.


그러나 내가 사용하는 환경은 Visual Studio 2015 Community 최신 버전이었기 때문에 별 도움이 안 됐다.


다음과 같이 관련된 몇 개의 글이 있었지만 문제를 해결할 수 없었다.


https://github.com/nanomsg/nanomsg/issues/472


https://support.microsoft.com/en-us/kb/826326


같은 프로젝트를 Visual Studio 2010으로 빌드해보아도 동일한 실패 현상을 겪었다.





해결:


해당 프로젝트는 OpenCV를 사용하는 프로젝트였는데, 추가 라이브러리로 지정된 OpenCV 경로가 다른 하드디스크(E:\)로 되어있었다.


나중에 알고보니 하드디스크 케이블에 문제가 생겨서 읽기/쓰기가 정상적으로 이루어지지 않고 있었다.


때문에 링커에서 라이브러리에 연결을 시도해도 디스크가 응답하지 않아서 에러가 생겼던 것이다.


하드디스크 케이블을 다른 것으로 교체한 후 디스크 작동이 정상적으로 이루어지는 것을 확인한 다음 다시 빌드를 시도했더니


LNK1000 링크 에러가 생기던 문제가 말끔히 해결되었다.

Posted by Kugi
,



OpenCV3.0.0 정적 라이브러리(Static Library)를 사용하도록 하여 release 모드로 빌드한 영상처리 어플리케이션을 내 컴퓨터가 아닌 다른 PC에서 테스트해봤는데


프로그램 실행까지는 정상적으로 되었는데 비디오 파일(.mp4)을 열려고 하면 실패하였다. 파일 경로의 문제는 아니었는데 코덱 문제일까 싶어서 좀 찾아봤더니

(http://answers.opencv.org/question/56519/opencv-24-static-lib-relies-on-opencv_ffmpegdll-on-windows/)


FFMPEG 라이브러리 때문에 생기는 문제였다.


FFMPEG 라이브러리는 GPL 라이선스를 적용받기 때문에 이 라이브러리를 정적으로 포함하도록 빌드할 경우 모든 소스코드가 똑같이 GPL 라이선스를 적용받아야 한다.


때문에 BSD 라이선스를 적용한 OpenCV는 이 FFMPEG 라이브러리를 동적으로 연결해서 사용하도록(DLL) 되어있다.


즉, 내가 다른 PC에서 테스트할 때 FFMPEG 라이브러리는 설치하지 않았기 때문에 비디오 파일을 열 때 실패하게 된 것이다.


release 된 .exe 파일과 같은 경로에 opencv_ffmpeg300.dll 파일을 넣어주었더니 제대로 비디오 파일을 여는 데 성공했다.


opencv_ffmpeg300.dll 파일은 다음과 같이 OpenCV bin 폴더 내에 들어있다.






참고로 OpenCV를 정적으로 빌드하기 위해서는 추가 종속성(Additional Dependencies)에 OpenCV의 staticlib 내의 라이브러리 파일들 뿐만 아니라


다음과 같은 추가적인 라이브러리 파일 입력이 필요하다. (x86 시스템 기반 기준)

 - comctl32.lib

 - vfw32.lib



개발환경은 Windows 8.1 Pro K, Visual Studio 2013 Professional 이며 C++를 사용했다.

테스트했던 PC는 Windows 7 Enterprise이다.



나중에 편리하게 사용하기 위해 전체 입력을 여기에 기록했다.

comctl32.lib

vfw32.lib

IlmImf.lib

ippicvmt.lib

libjasper.lib

libjpeg.lib

libpng.lib

libtiff.lib

libwebp.lib

opencv_calib3d300.lib

opencv_core300.lib

opencv_features2d300.lib

opencv_flann300.lib

opencv_hal300.lib

opencv_highgui300.lib

opencv_imgcodecs300.lib

opencv_imgproc300.lib

opencv_ml300.lib

opencv_objdetect300.lib

opencv_photo300.lib

opencv_shape300.lib

opencv_stitching300.lib

opencv_superres300.lib

opencv_ts300.lib

opencv_video300.lib

opencv_videoio300.lib

opencv_videostab300.lib

zlib.lib


Posted by Kugi
,



전혀 모르는 사람들을 위해 설명을 덧붙이자면 Visual Studio는 Microsoft에서 개발한 프로그래밍 툴(주로 C, C++, C# 등)이고,


OpenCV는 컴퓨터 영상 처리 작업을 편리하게 해주는 오픈 소스 라이브러리이다. 이 설명도 알아들을 수 없다면 아마도 이 글은 별로 도움이 안될 것이다.




현재 상용화된 Microsoft Visual Studio의 가장 최신 버전은 Visual Studio 2013이며,


최신 stable 버전의 OpenCV는 openCV-2.4.9 이다. (openCV-3.0.0은 알파버전만 나와있다.)


하지만 이번 포스트에서는 Visual Studio 2008에 OpenCV 2.1버전을 설치하는 과정을 정리한다.


비쥬얼스튜디오 2008까지는 [프로젝트 및 솔루션] 설정 및 [C++ 디렉터리 설정]이 전역으로 관리되나,


Visual Studio 2010 이후로는 해당 설정이 프로젝트 단위로 관리된다는 점을 제외하면 OpenCV 개발 환경을 셋업하는 방법은 크게 다르지 않다.


(OpenCV 버전에 따라서 설치 폴더의 하위 경로들은 조금 씩 다를 수 있다)


VS2008이 이미 설치되어있고 정상적으로 돌아간다는 가정 하에 OpenCV 개발환경 구축 과정을 보도록 하자.


참고로 사용한 운영체제는 Windows 8.1 64bits 버전이지만 운영체제가 달라도 크게 영향은 없을 것이다. openCV는 32bits (x86)버전으로 설치한다.




1. OpenCV의 다운로드와 설치



아래의 소스포지 링크에서 버전별 OpenCV 다운로드를 제공한다. 버전이 올라갈수록 용량도 커진다. (현재 3.0.0 버전은 367.3MB이다.)


   ☞  http://sourceforge.net/projects/opencvlibrary/files/opencv-win/


그 중 2.1버전의 폴더를 선택하여 하위폴더로 들어간 후, [OpenCV-2.1.0-win32-vs2008.exe] 파일을 다운로드 받는다.


(사실, 설치라고 해봤자 압축을 푸는 정도이지만, exe파일인 설치마법사는 시스템 환경 변수 설정을 수동으로 할 필요가 없어서 덜 번거롭다.)


다운로드 후 설치파일을 실행하여 설치를 진행하면 여느 설치파일과 마찬가지로 약관 동의 화면이 나온다.


설치를 동의하고 다음 화면으로 넘어가면 시스템 경로 (System PATH) 추가를 묻는 화면이 있다.



두번째 항목인 "Add OpenCV to the system PATH for all users"를 선택 후 다음으로 넘어간다.


다음 화면에서는 설치 경로를 지정한다. 될 수 있으면 간단하고 영문과 숫자로만 이루어진 경로가 좋다.



그 다음 화면은 프로그램의 바로 가기 아이콘을 생성할 시작 메뉴 폴더를 지정하는 부분이다. 여기는 별로 중요하지 않으므로 아무렇게나 해도 상관없다.


마지막은 다음과 같은 설치 구성 요소 선택 화면이다. main과 src 단 두 개 뿐이지만 그냥 Full 항목을 선택하도록 하겠다.



이제 [설치]를 누르면 드디어 설치가 진행된다. 완료되도록 기다린다.



설치가 완료되면 다음과 같이 제대로 설치되었다는 화면이 보일 것이다.



또한 설치 경로에 openCV가 압축 해제된 폴더가 보일 것이며, 시스템 Path 환경변수에 (OpenCV 설치경로)\bin 경로가 추가되어있을 것이다.


원래는 bin 폴더를 직접 추가해줘야해서 귀찮은 부분이다.


bin 폴더에는 OpenCV의 dll(동적라이브러리) 파일들이 들어있어서, 우리가 작성한 프로그램 빌드시 설정이 동적라이브러리 참조인 경우


프로그램을 실행할 때 저 경로를 참조하여 OpenCV 라이브러리를 불러온다.


따라서 이 환경변수가 등록되어있지 않으면 빌드 설정에 따라 다르지만 OpenCV를 사용한 응용프로그램이 문제없이 빌드는 되는데


런타임 오류를 내며 실행이 안되는 경우가 생길 수도 있다.


환경변수를 확인해보자





2. OpenCV의 다운로드와 설치


그러면 이제 남은것은 Visual Studio의 설정 뿐이다.


위 과정중에 Visual Studio가 실행중이었다면 종료하고 다시 실행시키도록 한다.


시스템 환경 변수가 편집되었지만 이는 프로그램이 처음 실행될 때 참조되기때문에 이미 실행중인 프로그램에는 반영되지 않기 때문이다.


만약 비쥬얼 스튜디오를 설치한 직후라면 OpenCV를 위한 설정을 하기 전에 우선 테스트용 프로젝트를 만들어서 Visual Studio가 제대로 돌아가는지부터 확인해보자.



Visual Studio에는 문제가 없음을 확인했다. 여기서 제대로 안된다면 인터넷 검색을 통해 해당 부분을 먼저 해결하고 다시 오도록 한다.


필자와 마찬가지로 Visual Studio 2008에 설정을 하고자 한다면 우측 상단 메뉴줄에서


[도구] -> [옵션] 창을 열고


[프로젝트 및 솔루션] -> [VC++ 디렉터리] 항목으로 이동하도록 한다.


만약 VS2010 이상의 버전이라면 프로젝트를 생성한 후 솔루션 뷰에서 오른쪽 클릭하여 [속성] 창을 열던지,


상단 프로젝트에서 [프로젝트] -> [속성]을 선택해 프로젝트 속성 페이지를 열고


[구성 속성] -> [VC++ 디렉터리] 항목으로 이동하면 된다.




VS2008을 기준으로 계속 설명하자면, 


먼저 "다음 파일의 디렉토리 표시" 항목에서 [포함 파일]을 선택한 후 다음과 같은 include 경로들을 추가해준다.


(OpenCV 설치경로)\include

(OpenCV 설치경로)\include\opencv

상위버전의 OpenCV라면 opencv2 폴더 또한 포함 디렉터리에 추가한다.


이 과정이 끝나야 opencv 헤더파일들이 추가된다.



그 다음은 "다음 파일의 디렉토리 표시" 항목을 [라이브러리 파일]로 바꾼 후 다음과 같이 library 경로를 추가해준다.


(OpenCV 설치경로)\lib

상위 버전의 OpenCV라면 필요에 따라 정적라이브러리폴더인 staticlib 폴더 또한 추가한다.


OpenCV가 상위 버전이라면 추가할 경로들이 좀 더 복잡하다는 것을 염두에 두어야 한다.


예를 들어 opencv-2.4.9 버전에서 [포함 디렉터리]는 (OpenCV 설치경로)\build\include 에 있고


[라이브러리 디렉터리]는 (OpenCV 설치경로)\build\(x86 또는 x64)\vcXX(VS버전)\lib와 같다.



이제 마지막으로 사용할 라이브러리 파일들을 지정해주면 된다. 이 부분은 VS2008이나 상위버전의 비쥬얼 스튜디오나 똑같이


프로젝트 속성 페이지에서 [구성 속성] -> [링커] -> [입력] 항목으로 이동한다.



이 화면에서 [추가 종속성] 항목에 사용할 라이브러리 파일들을 입력해주어야 한다. 이 파일들은 위에서 입력한 lib 폴더 안에 들어있다.


참고로 OpenCV 라이브러리 파일들은 Debug용과 Release용으로 나뉘어져 있다. 현재 구성이 Debug모드이므로 디버그용 라이브러리 파일들만 추가한다.


debug용 파일들은 전부 파일 이름 끝에 'd'가 붙어있어서 ~d.lib 형태이다.


만약 릴리즈를 하고자 하면 "구성"을 release로 변경하여 이 부분을 release 전용 파일들로 새로 입력해주어야 할 것이다.


입력할 파일들의 이름은 다음과 같다.


cv210d.lib

cvaux210d.lib

cxcore210d.lib

highgui210d.lib

ml210d.lib

opencv_ffmpeg210d.lib

이 목록은 opencv 버전에 따라 다르고, 또 굳이 전부 넣을 필요 없이 필요한 기능의 모듈만 넣어주면 된다.


하지만 지금은 아무것도 모르는 상태일 가능성이 높기 때문에 그냥 전부 추가해놓는게 편할 것이다.


확장자인 ".lib"를 빼먹지 않도록 주의한다.



여기까지가 OpenCV 개발환경 구축의 끝이다.


그러면 이제 제대로 돌아가는지 확인해볼 차례이다.




3. OpenCV 구동 테스트


단순히 이미지를 불러와서 창에 띄우는 간단한 win32 콘솔 응용프로그램을 돌려보도록 하자.


불러올 이미지는 영상처리 분야에서 흔하게 쓰이게 된 lena라는 인물의 유명한 얼굴 이미지를 사용할 것이다. (포르노 사진의 일부분이다.)


아래 이미지를 저장해서 사용하면 된다.




사용할 이미지는 프로젝트 폴더 내에 위치시키도록 한다.


솔루션 뷰에서 프로젝트에 오른쪽 클릭하여 나오는 팝업 메뉴에서 [Windows 탐색기에서 폴더 열기]라는 메뉴를 통해 프로젝트 폴더를 바로 열 수 있다.



이미지까지 준비가 되었으니 이제 소스코드만 있으면 된다.


지금은 OpenCV 함수들을 하나도 모를테니 우선 그냥 소스코드를 그대로 복사해서 실행해보도록 하자.



main.cpp

#include <stdio.h>
#include <cv.h>
#include <highgui.h>

int main(void)
{
	printf("OpenCV 2.1 test :: http://kugistory.net\n");	

	// "lena256.bmp" 이미지 불러오기
	IplImage* inputImage = cvLoadImage("lena256.bmp");

	// "this is a test image."라는 이름의 새 창을 만들어 이미지 보여주기
	cvShowImage("this is a test image.", inputImage);

	// 사용자 키 입력 기다리기
	cvWaitKey();

	// 모든 openCV 창 닫기
	cvDestroyAllWindows();

	// 불러온 이미지 메모리 해제
	cvReleaseImage(&inputImage);

	return 0;
}



이 프로그램을 실행한 결과이다.



콘솔창과 함께 lena256.bmp 영상이 출력된 새 창이 떠있는 것을 확인할 수 있다. 이 창에 포커스를 유지한 채 아무 키나 누르면 창이 닫히며 프로그램이 종료된다.




드디어 환경 구축이 진짜로 끝이 났다. 다양한 책과 인터넷 문서들을 통해 OpenCV 함수들의 사용 방법을 익혀보도록 하자.



'Development > Image Processing' 카테고리의 다른 글

핀홀 카메라 모델 (pinhole camera model)  (1) 2013.04.19
적분 영상 (integral image)  (13) 2012.09.16
Posted by Kugi
,



간단한 테스트용 클래스를 만드는데  vector때문에 컴파일 에러가 발생했다.


error C2143: 구문 오류 : ';'이(가) '<' 앞에 없습니다.

error C4430: 형식 지정자가 없습니다. int로 가정합니다. 참고: C++에서는 기본 int를 지원하지 않습니다.

error C2238: ';' 앞에 예기치 않은 토큰이 있습니다.


헤더 선언 [#include <vector>] 및 네임스페이스 선언 [using namespace std;]는 미리 컴파일된 헤더[stdafx.h]에 추가해두었기 때문에

정상적으로 컴파일이 되어야 했으나 그러지 못했다.


짐작되는 원인으로는,

openCV라이브러리를 사용하고 있는데 이 라이브러리 내부의 네임스페이스와 겹치거나 하는 일이 생기는 듯 하다.



vector 선언에 네임스페이스를 명시해주니 문제가 해결되었다.

  --> std::vector<PCTYPE> m_ticks;



header


#pragma once

#define PCTYPE		__int64

class PerformCheck
{
private:
	PCTYPE m_lastTick;
	PCTYPE m_currentTick;

	vector<pctype> m_ticks;   // a compile error occurred here. attach "std::"

public:
	PerformCheck();
	~PerformCheck();

public:
	// Add current tick count to the queue with incremental index.
	// @return: elapsed time from last call to current call
	PCTYPE AddCheck();

	PCTYPE GetElapsed(const unsigned int& idxFrom, const unsigned int& idxTo);

	inline
	void Clear()
	{
		m_ticks.clear();
		m_lastTick = cvGetTickCount();
	}
};


Posted by Kugi
,



이클립스(Juno)에서 openCV JNI sample 프로젝트를 돌려보려는데

 

"\ndk-build.cmd": Launching failed

 

와 같은 에러를 뱉어내었다.

 

ndk 플러그인을 설치하였기 때문에 이클립스에서 빌드가 되면 동시에 ndk build가 이루어져야 하는데 실패한 것이다.

 

해결 방법은 다음과 같이 ndk-build.cmd 파일이 있는 경로를 NDKROOT 환경변수에 추가해 주면 된다.

 

 

 

 

Posted by Kugi
,