android-ndk-r4-windows-crystax-4 이다.

NDK를 사용하고 안드로이드에 OpenCV를 올리기 위해서는 정식 NDK 버전이 아닌 crystax ndk 버전이 필요하다고 한다?? 정식 NDK로 잘 안되는 경우는 이 파일을 받아서 사용하길 바란다.


다운로드

영상처리에서 RGB 색상모델을 이용하여 간단하게 색상을 검출하는 방법에 대해서 알아보겠다.


RGB 색상모델을 실제 영상처리에서 사용하는 일은 드물다 RGB 색상모델은 조명에 영향을 많이 받기 때문에 정확도가 많이 떨어진다. 그러나 간단하게 색을 인식하는 용도로 RGB 색상모델을 쓰기도 한다. 


영상처리의 기초로 간단하게 붉은색을 인식하는 예제를 알아보도록 하겠다.


소스를 먼저 보고 설명을 하도록 하겠다.


#include <opencv\highgui.h>

int main() {
	IplImage *frame;	// 원본영상
	IplImage *red;		// 색 검출 영상

	int width, height;	// 창의 넓이, 높이
	int i, j, index;
	unsigned char R, G, B;

	CvCapture* capture = cvCaptureFromCAM(0);
	frame = cvQueryFrame(capture);

	// frame 에서 width와 height 정보를 가져온다.
	width = frame->width;
	height = frame->height;
	
	cvNamedWindow("Original",0);
	cvNamedWindow("Red Tracking",0);
	cvResizeWindow("Original", width, height);
	cvResizeWindow("Red Tracking", width, height);

	// frame와 같은 크기를 갖는 3채널 영상 생성
	red = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 3);

	while(capture) {
		frame = cvQueryFrame(capture);

		for(i = 0; i < (frame->height); i++) {
			for(j = 0; j < (frame->widthStep); j += (frame->nChannels)) {
				index = i * frame->widthStep + j;

				R = frame->imageData[index+2];	// R영역
				G = frame->imageData[index+1];	// G영역
				B = frame->imageData[index+0];	// B영역

				// 붉은색으로 예상되는 범위 설정
				if(R > 200 && G < 200 && B < 200) {
					// 흰색으로
					red->imageData[(i*frame->widthStep)+j + 0] = 255;	
					red->imageData[(i*frame->widthStep)+j + 1] = 255;
					red->imageData[(i*frame->widthStep)+j + 2] = 255;
				}
				else {
					// 검정색으로
					red->imageData[(i*frame->widthStep)+j + 0] = 0;
					red->imageData[(i*frame->widthStep)+j + 1] = 0;
					red->imageData[(i*frame->widthStep)+j + 2] = 0;
				}
			}
		}

		cvShowImage("Original",frame);
		cvShowImage("Red Tracking",red);

		if(cvWaitKey(33) >= 27)
			break;
	}
	cvReleaseCapture(&capture);
	cvReleaseImage(&red);
	cvDestroyWindow("Original");
	cvDestroyWindow("Red Tracking");

	return 0;
}

붉은색 영역은 본인이 임의로 설정하였다. 먼저 결과부터 확인해 보겠다.


실행결과 :


추출된 범위를 흰색으로(255) 나타내고 그 외의 범위는 검정색으로(0)으로 나타내었다.


이번 포스팅은 색상 검출에 대한 내용이므로 다른 코드에 대한 설명은 나중에 하도록 하겠다.


색상 범위


색상 검출한 결과를 나타내기 위해서 red라는 3채널의 IplImage 구조체를 선언하였다. 

카메라에서 프레임을 받아오는 동안 (while문 안에서) for 2개를 이용하여 전체영상의 각 ImageData에 접근하여서 R,G,B의 크기를 판단하였다. 

R,G,B 영역의 범위는 본인이 임의로 설정하였는데, 빨간색을 검출한다고 해서 꼭 R이 255의 값을 갖고 G와 B값은 0을 갖는것이 아니다. 컴퓨터로 작업을 한 영상이라면 R=255, G=0, B=0 의 값을 갖을수는 있지만 실제 영상에서 빨간색은 R,G,B 각각의 색상모델의 조합으로 나타내진다. 또한 그 값은 조명에 의해, 주변 환경에 의해 충분히 달라질 수 있다. 그렇기 때문에 색상검출을 위해서 실제로 사용할 경우 정확도가 크게 떨어지게 된다. 이러한 단점을 해결하기 위해 다양한 색상모델이 있고 대표적으로 YCbCr 모델을 많이 사용하고 있다. YCbCr에 대해서는 나중에 알아보도록 하겠다. 


RGB영역에서 색 검출을 굳이 하고싶다면 색 검출을 위한 범위는 직접 지정하길 바란다. 위의 코드의 범위는 본인마음대로 대충 때려넣은 범위이다.


widthStep


while문 안에서 2개의 for 루프를 이용하여 영상의 넓이(width)와 높이(height)만큼의 크기의 배열에 접근하고 있다. 이때 두번째 for 루프에는 width가 아닌 widthStep이 들어가 있다. 분명 넓이는 width인데 왜 widthStep을 쓸까?


컬러영상은 다음과 같이 B, G, R 순서의 세 영역으로 이루어져 있다.


하나의 컬러 영상은 B평면(B값만 존재), G평면(G값만 존재), R평면(R값만 존재)에 존재하는 각 값들의 합으로 이루어 진다. 3개의 평면이 하나로 겹쳐지면서 컬러 영상이 만들어 지는것이다. 우리는 각 영역의 색상값을 알아내기 위해 하나의 평면을 갖는 컬러 영상을 3개의 평면으로 나누어 볼 필요가 있다. 그렇기 때문에 width 대신 widthStep을 이용하는데 widthStep은 (영상의넓이) x (채널의 갯수) 의 값을 갖고있다. 여기서는 채널이 3채널이기 때문에(width x 3)의 값을 갖고 있는 것이다. 

한번 for루프에 들어갈 경우 [index+2], [index+1], [index+0] 으로 컬러영상에서 같은 위치에 있는 RGB평면을 동시에 체크하기 때문에 for루프에서 증가값은 3이 되어야 한다. 그렇기 때문에 j값은 nChannel 만큼 증가하게 된다. 


다시한번 말하지만 RGB색상모델은 실제 영상처리에서 사용하기에 좋은 색상모델은 아니다. 




제 머리속에 있는 내용을 정리해 보았습니다! 틀린내용이 있을수도 있고 저의 머리속에 있는 내용을 글로 옮겼기 때문에 이해가 안되는 분들도 계실꺼 같습니다. 댓글을 남겨주신다면 친절히 답변해 드리겠습니다.

64비트 컴퓨터에 OpenCV를 설치할 때 MSVCP100D.dll 과 MSVCR100D.dll이 없어 프로그램을 시작할수 없습니다. 라는 경고문구가 뜰때가 있다.

이럴때는 아래 파일을 다운받아 압축을 해제한 뒤 해당 dll파일을 SysWOW64폴더(C:\Windows\SysWOW64)에 넣어주면 된다.


msvcp100d.zip


msvcr100d.zip


지금까지 이미지 출력과 동영상파일 출력을 알아보았는데, 이번 시간에는 웹캠으로부터 받은 영상을 띄우는 방법에 대해 알아보도록 하겠다. 동영상파일 출력까지 해보았다면 카메라(웹캠)영상은 쉽게 띄울수 있을것이다.


먼저 간단한 코드는 다음과 같다.

#include <opencv\highgui.h>

int main() {
	IplImage *frame;
	
	CvCapture* capture = cvCaptureFromCAM(0);

	cvNamedWindow("Test",1);
	
	while(capture) {
		frame = cvQueryFrame(capture);
		cvShowImage("Test",frame);

		if(cvWaitKey(33) >= 27)
			break;
	}
	cvReleaseCapture(&capture);
	cvDestroyWindow("Test");

	return 0;
}

전체적으로 동영상을 출력할 때와 비슷하다. 동영상 출력과 다른점은 cvCaptureFromCAM()부분이다. cvCaptureFromCAM()함수를 이용하여 웹캠으로부터 영상을 받아온다. 인자로는 숫자를 입력하는데, 0을 넣을경우 가장 기본으로 연결되어 있는 웹캠으로부터 영상을 받아온다. 노트북의 경우 내장된 웹캠이 0번이고 추가적으로 연결을 한 웹캠이 1번으로 되어있을 것이다. PC의 경우 내장된 웹캠이 없으므로 연결한 웹캠이 0번이 된다. 

영상처리를 위한 코드는 while문 안의 cvQueryFrame()뒤에 넣어주면 된다.


실행화면 :



[영상처리] 이미지 파일 출력


[영상처리] 동영상파일(AVI) 출력

영상처리를 하기 위해 미리 녹화된 동영상을 쓰는 경우가 있다. 이번시간에는 동영상을 띄우는 방법에 대해 알아보도록 하겠다.

동영상 파일을 여는 일은 이미지 파일을 출력했던것 만큼 쉽다. 하지만 방법이 약간 다르다.

이미지 파일은 단순히 한장의 영상이지만, 동영상은 이미지 파일의 집합이라고 볼 수 있다. 여러개의 사진이 계속해서 바뀌는 개념이다. 그렇기 때문에 매 프레임마다 화면을 바꿔준다고 생각하면 될 것이다.


코드는 다음과 같다.

#include <opencv\highgui.h>

int main() {
	IplImage *frame;
	
	CvCapture* capture = cvCaptureFromFile("testAVI.avi");
	//CvCapture* capture = cvCreateFileCapture("testAVI.avi");
	//CvCapture* capture = cvCaptureFromAVI("testAVI.avi");

	cvNamedWindow("Test",1);
	
	while(capture) {
		frame = cvQueryFrame(capture);
		cvShowImage("Test",frame);

		if(cvWaitKey(33) == 27)
			break;
	}
	cvReleaseCapture(&capture);
	cvDestroyWindow("Test");

	return 0;
}

CvCapture형식의 capture에 영상을 저장한다.

동영상 파일을 불러올 때는 cvCaptureFromFile() 이나 cvCreateFileCapture() 또는 cvCaptureFromAVI()중 하나를 선택하여 사용한다. 각 함수의 차이점은 크게 없어보인다. 

인자로는 파일이름, 파일형식을 넣어준다. 

파일 형식은 avi, wmv, mp4, 3gp, mkv 등등이 되는 것 같다. 아마 왠만한 파일 형식은 로드가 될 것이지만 avi파일을 로드하는 것을 추천한다.

반복문이 시작하기 전에 cvNamedWindow()를 이용하여 영상을 띄울 윈도우를 생성한다.

while문을 사용하여 영상을 띄워준다. capture가 null이 아닐경우 반복문을 실행한다.

IplImage형식의 frame이라는 변수에 capture를 통해 얻어온 이미지를 cvQueryFrame()을 이용하여 입혀준다. 

cvWaitKey()를 이용하여 ESC를 입력하였을 때 종료하도록 한다.

cvWaitKey(33)에서 33은 프레임을 받아오는 속도이다. 단위는 미리 세컨드이다(1/1000초). 값이 높을수록 프레임이 느리다. 33을 입력하면 33/1000 이므로 대략 초당 30프레임정도를 받아올 것이다.


영상처리를 위한 코드는 while문 안에 cvQueryFrame()을 수행한 뒤에 넣어주면 된다.


실행화면 : 


capture의 값만 cvCaptureFromCAM()으로 변경해 준다면 웹캠영상도 띄울수 있다.


[영상처리] 이미지 파일 출력


[영상처리] 카메라(웹캠)영상 출력

OpenCV의 HighGUI라이브러리에는 다양한 포맷의 영상 파일을 불러올 수 있는 기능이 정의되어 있다.

HighGUI 라이브러리를 이용하여 영상을 불러와서 화면에 출력하는 예제이다.

#include <opencv\highgui.h>

int main() {
	IplImage *image = cvLoadImage("lena.jpg");

	cvNamedWindow("Test",1);
	cvShowImage("Test",image);
	cvWaitKey(0);

	cvReleaseImage(&image);
	cvDestroyWindow("Test");

	return 0;
}

cvLoadImage()는 영상 데이터의 구조체 포인터를 반환한다. 인자 값으로 파일명과 형식을 넣어준다.

구조체의 이름은 IplImage이며, 단일 채널, 다중 채널, 정수형, 실수형 등 모든 형태의 영상 데이터를 IplImage로 표현할 수 있다. 또한 BMP, DIB, JPEG, JPE, PNG, PBM, PGM, PPM, SR, RAS, TIFF 등의 영상 포맷을 지원한다.

*출력할 영상은 프로젝트 폴더내에 존재하여야 한다.


cvNamedWindow()는 영상을 표시할 윈도우를 하나 만드는 일을 한다.

첫 번째 인자는 윈도우의 이름으로 등록된다.

두 번째 인자는 윈도우의 속성을 지정한다. 여기에는 0(기본값) 또는 1이 들어갈 수가 있다.

인자값이 0으로 지정되면 불러오는 영상의 크기에 상관없이 윈도우 크기는 일정하게 고정이 되고, 영상이 윈도우의 크기에 맞게 확대 또는 축소되어 나타난다. 만약 1(CV_WINDOW_AUTOSIZE)이면 불러오는 영상의 실제 크기에 맞게 윈도우의 크기가 자동으로 조절된다.


cvShowImage()함수는 IplImage* 타입으로 생성된 영상을 해당 제목을 갖은 윈도우에 영상을 출력한다.

첫번째 인자는 윈도우의 이름이고, 두번째 인자는 IplImage이다.


cvWaitKey()함수는 프로그램의 동작을 잠시 멈추고 사용자로부터 키 입력을 기다린다.

양의 정수일 경우 밀리초(millisecond) 단위로 지정한 시간동안 대기한다.

인자값이 0이나 음수일 경우 키가 눌려질 때 까지 무한정 기다린다.


cvReleaseImage()함수는 할당된 메모리 공간을 해제한다. 

인자로 IplImage*의 주소값을 전달해준다. 이 함수가 실행된 후 해당 IplImage는 NULL로 설정된다.


cvDestroyWindow()함수는 윈도우를 닫고, 윈도우를 위해 동적할당된 메모리 공간을 모두 해제한다. 

cvDestroyAllWindows()함수를 이용하여 한번에 모든 창을 닫을 수도 있다.


간단한 프로그램의 경우 프로그램이 종료할 때 운영체제에 의해 할당된 모든 리소스들이 자동으로 반환되지만 cvReleaseImage()함수와 cvDestroyWindow()함수를 직접 호출하여 리소스를 반환하는것이 좋다.





이미지 파일을 출력하는 또 다른 방법이 있다. 다음과 같이 소스를 작성했을 경우 명령프롬프트 창을 이용하여 실행해야한다.

#include <opencv\highgui.h>

int main(int argc, char** argv) {
	IplImage *image = cvLoadImage( argv[1] );

	cvNamedWindow("Test",1);
	cvShowImage("Test",image);
	cvWaitKey(0);

	cvReleaseImage(&image);
	cvDestroyWindow("Test");

	return 0;
}

main함수에 인자가 있는 경우인데, 코드를 작성한뒤 디버깅을 해야 코드가 적용된다. 코드 작성후 디버깅을 한뒤 명령프롬프트 창에서 명령어를 입력해준다.

이때 출력할 영상파일이 같은 폴더에 존재하여야 한다. 


프로젝트폴더\Debug>프로젝트이름.exe 이미지파일.파일형식



다음과 같이 입력하면 영상이 출력되는 모습을 볼 수 있다.


[영상처리] 동영상파일(AVI) 출력


[영상처리] 카메라(웹캠)영상 출력

  1. ILEN 2015.12.16 21:55 신고

    제가 게임,ppt만들려고 이미지 출력을 알아둘려고 했는데
    너무 어려워서 이곳 저곳 가봤는데 이발로그에서 찾았네요 ㅎㅎ
    정말정말로 감사합니다
    블로그 잘보고 갑니다!

  2. 정제영 2016.04.27 18:34 신고

    사용하신 iplimage라는 구조체에는 어떤 내용이 담겨있는지 알 수 있을까요?

  3. 동현 2016.07.30 19:21 신고

    위 코드를 치게 되면
    c:\users\chobo\documents\visual studio 2010\projects\opencv_test\opencv_test\opencv_test.c(5): error C2198: 'cvLoadImage' : 호출에 매개 변수가 너무 적습니다.

    와 같은 경고 메세지가 나오는데 이건 왜 그런건가요 ??

Visual Studio 2010에 OpenCV 2.4.8버전을 설치해 보겠다. Visual 6.0 + OpenCV 1.0 버전부터 Visual Studio2012까지 OpenCV를 설치해 보았지만 OpenCV를 설치하는 일이란 참 귀찮다.. 이번엔 Visual Studio 2010에 설치를 할텐데, Visual Studio 2012에 설치하는 방법이랑 별 다른 차이는 없을듯 하다.

1. OpenCV 다운받기

다운받으러 가기

설치하기 위해 OpenCV 최신버전을 받는다. 현재(2014.1.5) 최신버전은 2.4.8버전이다.

다운받은후 실행하여 압축을 해제한다. 난 C드라이브에 압축해제 하였다. 알아서 opencv라는 폴더가 생성이 될 것이다.



2. 환경변수 설정

내컴퓨터 - 속성 - 고급 시스템 설정 - 환경변수 - 시스템변수 - Path - 편집

이전 환경변수를 ;(세미콜론)으로 구분지어주고
(Opencv설치폴더)\build\x86\vc10\bin; 입력 후 확인

ex) C:\opencv\build\x86\vc10\bin;

Visual Studio 2010 의 경우 vc10
Visual Studio 2008 의 경우 vc9 를 선택하면 된다.

x86은 32bit
x64는 64bit 환경이다.

재부팅을 해야 환경변수가 적용이 된다. 재부팅을 하고 계속 진행을 하자


3. 속성 설정

Visual Studio 2010 실행 후 Win32 콘솔 응용 프로그램으로 프로젝트를 생성한다. 


빈 프로젝트로 생성한다.


프로젝트 생성후 속성 관리자에서 새 프로젝트 속성 시트를 추가한다.
Debug|Win32 - 마우스 오른쪽 클릭 - 새 프로젝트 속성 시트 추가


OpenCV_Debug로 생성된 속성을 열어 수정한다.
OpenCV_Debug - 마우스 오른쪽 클릭 - 속성

공용 속성 - C/C++ - 일반 - 추가 포함 디렉터리를 추가한다.
(OpenCV 설치 폴더)\build\include

ex) C:\opencv\build\include

공용 속성 - 링커 - 일반 - 추가 라이브러리 디렉터리를 추가한다.
(OpenCV 설치 폴더)\build\x86\vb10\lib

ex) C:\opencv\build\x86\vc10\lib

공용 속성 - 링커 - 입력 - 추가 종속성 을 추가한다.
필요한 것들만 추가해도 된다. 하나를 추가 할 때 마다 ;(세미콜론)으로 구분지어 줘야한다.

opencv_calib3d248d.lib
opencv_contrib248d.lib
opencv_core248d.lib
opencv_features2d248d.lib
opencv_flann248d.lib
opencv_gpu248d.lib
opencv_highgui248d.lib
opencv_imgproc248d.lib
opencv_legacy248d.lib
opencv_ml248d.lib
opencv_nonfree248d.lib
opencv_objdetect248d.lib
opencv_ocl248d.lib
opencv_photo248d.lib
opencv_stitching248d.lib
opencv_superres248d.lib
opencv_ts248d.lib
opencv_video248d.lib
opencv_videostab248d.lib

(추가 해주는 이름뒤에 숫자는(248) 2.4.8 버전 이라는 뜻이므로 다른 버전을 설치한다면 숫자를 바꿔줘야한다.
또한 Debug모드이기 때문에 맨 뒤에 d가 들어가는데 Release모드라면 d를 빼고 입력해주면 된다.)


4. 테스트 하기

모든 설정이 끝났기 때문에 테스트를 해보겠다. 소스파일을 하나 생성한다. 

소스 파일 생성후 다음과 같은 코드를 입력한다.

#include <opencv\cv.h>
#include <opencv\highgui.h>

int main() {
	IplImage *image = cvLoadImage("test.jpg");

	cvShowImage("Test",image);
	cvWaitKey(0);

	cvReleaseImage(&image);
}

출력할 이미지인 test.jpg 파일을 프로젝트 폴더안에 넣어두고 실행을 한다.
test.jpg의 이미지가 나온다면 힘겨웠던 opencv 설치가 완료된것이다.^^

앞으로 새로운 프로젝트를 생성했을시 지금 만들었던 속성을 불러와서 사용하면 된다.

힘겨운 Open CV 설치 과정이 끝났다. 잘 따라했는데 에러가 난다면 오타가 있거나 중간에 틀린 부분이 있을것이다.

그러나 잘 따라 했다고 해도 에러가 나는 경우가 있다 64비트 컴퓨터에 그러한 경우가 발생할 텐데 아래 글을 읽고 해결하도록 하자.

2014/01/25 - [Programming/영상처리] - [영상처리] 64bit에 OpenCV 설치 에러 해결방법



  1. 이전 댓글 더보기
  2. 2014.04.15 20:25

    비밀댓글입니다

    • 영상털이범 2014.04.16 16:47 신고

      감사합니다 ^.^
      제가 요즘 개인적인 사정에 의해서 글을 못올리고 있는데요
      필요한 정보가 있으시면 말씀해주세요^^
      시간이 될때 우선적으로 포스팅 하겠습니다~!

  3. 자세한설명~ 2014.04.29 00:18 신고

    정말 고맙습니다^^

  4. Opencv 2014.06.30 09:53 신고

    감사합니다. 덕분에 빠르게 설치 완료했습니다^^

  5. 2014.07.09 11:04

    비밀댓글입니다

  6. 에러가뜨네요자꾸 2014.07.15 17:02 신고

    하.. 지식인에 질문해놨어요 여긴 뭐 사진올리고그런게없어서
    http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=104&docId=202167114
    마지막 TEST하는데 소스 집어넣고 컨트롤 에프오 눌러서 실행시켰는데 먼가 에러가 나오네요 그림처럼 답변좀해주세용 여기다가해주셔도되고요

    • 영상털이범 2014.07.15 20:56 신고

      환경변수 설정은 제대로 하셨는지, 경로는 제대로 하셨는지 한번더 확인해 주시고
      환경변수 설정 후에는 재부팅을 한번 해주세요
      그래도 안된다면 다시 답변을 주시길 바랍니다!

  7. 에러가뜨네요자꾸 2014.07.16 13:37 신고

    아 여기엔 긂이 안붙여져서 답ㄷ바하네요 ㅋ 환경변수 path에 편집 누르고 보니깐
    C:\opencv\build\x64\vc10;bin; 를 뒤에 붙이기전에 써있는 것들이

    C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x86;C:\Program Files (x86)\Intel\OpenCL SDK\2.0\bin\x64;C:\Program Files (x86)\Windows Live\Shared;C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\;C:\Program Files\Microsoft SQL Server\100\Tools\Binn\;C:\Program Files\Microsoft SQL Server\100\DTS\Binn\ 이렇게 되있던데요.. 그냥 여기에다가 뒤에 C:\opencv\build\x64\vc10;bin; 이거 붙이는거맞죠? 그림 보니깐 include 머 이런거 써있으시던데..

    • 영상털이범 2014.07.16 16:00 신고

      원래 있던 path에서
      맨 끝부분에 세미콜론 ( ; )을 하나 붙여서 구분해 주시고요
      그다음에 C:\opencv\build\x64\vc10\bin;
      이게 맞는거겠죠?
      군더더기 업이 정리하자면
      ;C:\opencv\build\x64\vc10\bin;
      이렇게 쓰는게 맞겠네요
      님께서는 오타가 있으니 확인해주세요

  8. 완전초보자 2014.07.26 19:16 신고

    혹시 아래의 2가지 오류에 대해서 해결할방법이 있을까요? 아래 2가지의 파일이 경로에 있는데 자꾸 실행만 시키면 저 2가지가 찾거나 열 수 없다고 뜨네요

    opencv01.exe': 'C:\opencv\build\x86\vc10\bin\opencv_core249d.dll' 로드, PDB 파일을 찾거나 열 수 없습니다.
    'opencv01.exe': 'C:\opencv\build\x86\vc10\bin\opencv_highgui249d.dll' 로드, PDB 파일을 찾거나 열 수 없습니다.

    • 영상털이범 2014.07.28 08:45 신고

      일단 속성페이지에서 [공용 속성] - [링커] - [입력] - [추가 종속성] 항목에
      제대로 추가를 해주셨는지 확인해 주시길 바랍니다.
      저런 경우에는 대게 오타가 있는 경우가 많습니다.
      또한 환경변수 설정후 재부팅을 하지 않아도 저런 경우가 발생하곤 합니다.
      제일먼저 오타확인부터 해주시길 바랍니다~!

  9. Lutece. 2014.08.06 09:38 신고

    좋은 글 감사합니다!
    꼼꼼하게 설명되어 있어서 잘 설치되었네요!!

    그런데 속성관리자에 설정해주는 것은 새로운 프로젝트를 생성할 때마다 해주어야 되는 건가요?? 매우 번거롭군요 ㅜ

    • 영상털이범 2014.08.06 21:06 신고

      새로운 프로젝트 생성시
      속성관리자를 새로 설정하지 않고
      이전에 설치했던 프로젝트의 속성을 불러와서 사용하면 됩니다!
      '새 프로젝트 속성 시트 추가' 가 아닌
      ' 기존 속성 시트 추가' 를 선택하시고 이전 프로젝트를 뒤져보시면 저장해두신 속성이 있을겁니다!

  10. parks 2014.08.06 14:52 신고

    감사합니다. 가볍게 성공했네요~~
    문제의 대부분은 오타라는것을 깨달았습니다. 30분만에 성공했네요 ㄷㄷㄷ

    • 영상털이범 2014.08.06 21:06 신고

      저도 얼마전에 오랜만에 설치하다가 30분정도 걸렸네요..ㅎㅎ
      결국엔 오타..ㅎㅎ

  11. oh 2014.09.17 22:58 신고

    제가2.4.9버전을 다운받아서 다 249로 바꿔서 설정했는데 왜 저런 오류가 뜰까요? ㅠㅠ

    1>LINK : fatal error LNK1104: 'opencv_flann248d.lib' 파일을 열 수 없습니다.

    • 영상털이범 2014.09.19 09:12 신고

      opencv_flann248d.lib 파일을 열 수 없다는 메세지인데
      숫자가 248로 되어있죠?
      아마도 249로 바꾸지 않은 부분이 있는것 같습니다.
      오타일 확률이 99% 이기 때문에 다시한번 살펴보시길 바랍니다.

  12. 김길호 2014.09.18 11:57 신고

    어렵게 오늘 opencv 2.4.9를 설치 했습니다.
    테스트 소스를 실행했는데 이미지가 출력이 되지않고 회색 박스만 출력이 되네요
    이미지 크기는 644*482인 jpg 파일 입니다. 이미지가 출력되지 않는 이유를 모르겠네요.

    • 영상털이범 2014.09.19 09:14 신고

      이미지파일의 이름을 제대로 적어주셨나요?
      이미지파일의 경로가 잘 못 되어있는건 아닌가요?
      다시한번 확인해주시길 바랍니다.

  13. opencv설치.ㅜㅜ 2014.09.21 13:59 신고

    설정을 다 하고 웹캠을 띄우는 예제소스를 넣었는데 컴파일은 성공했다고 뜹니다.

    근데 opencv_core249d.dll이 찾을 수 없다네요.

    어떻게 해결 방법이 없을까요??ㅜㅜ

    아래주소는 사진첨부입니다ㅜㅜ

    http://kinimage.naver.net/20140921_131/1411274265245b54dN_PNG/3.PNG?type=w620

  14. 123 2014.11.11 10:11 신고

    원래 있던 환경변수를 실수로 삭제하였는데
    복구는 불가능한가요?

  15. 2015.03.05 18:15

    비밀댓글입니다

  16. 장광순 2015.04.06 11:26 신고

    1>------ 빌드 시작: 프로젝트: OpenCV_Test, 구성: Debug Win32 ------
    1> test.cpp
    1>c:\opencv\build\include\opencv2\flann\dist.h : warning C4819: 현재 코드 페이지(949)에서 표시할 수 없는 문자가 파일에 들어 있습니다. 데이터가 손실되지 않게 하려면 해당 파일을 유니코드 형식으로 저장하십시오.
    1>c:\opencv\build\include\opencv2\flann\logger.h(66): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\stdio.h(218) : 'fopen' 선언을 참조하십시오.
    1>test.obj : error LNK2019: _cvReleaseImage 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.
    1>test.obj : error LNK2019: _cvShowImage 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.
    1>test.obj : error LNK2019: _cvLoadImage 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.
    1>test.obj : error LNK2019: _cvWaitKey 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.
    1>C:\Users\User\Desktop\OpenCV_Test\Debug\OpenCV_Test.exe : fatal error LNK1120: 4개의 확인할 수 없는 외부 참조입니다.
    ========== 빌드: 성공 0, 실패 1, 최신 0, 생략 0 ==========
    라는데 이런건 어떻게 해야되나요. 라이브러리나 Path 다 올바르게 하였는데..

  17. 이창훈 2015.05.06 13:40 신고

    > 모든 출력이 최신 상태입니다.
    1>testtest.obj : error LNK2019: _cvReleaseImage 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.
    1>testtest.obj : error LNK2019: _cvWaitKey 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.
    1>testtest.obj : error LNK2019: _cvShowImage 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.
    1>testtest.obj : error LNK2019: _cvLoadImage 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.
    1>C:\Users\Administrator\Documents\Visual Studio 2010\Projects\OpenCV_Test\Debug\OpenCV_Test.exe : fatal error LNK1120: 4개의 확인할 수 없는 외부 참조입니다.
    1>

  18. 김종호 2015.05.11 11:45 신고

    Error 1 error LNK1123: failure during conversion to COFF: file invalid or corrupt C:\Users\jong ho kim\Desktop\OpenCV_Test\OpenCV_Test\LINK OpenCV_Test

    Error 2 IntelliSense: cannot open source file "defines.h" c:\opencv\build\include\opencv2\flann\dis

    이러한 에러가 뜹니다 이 경우는 왜그런가요?
    왜 defines.h 를 오픈할 수 없나요

  19. 박지철 2015.06.01 20:09 신고

    VC11은 이거 뭐죠 제가사용하는 visual 은 2010인데

  20. 영상처리하고파 2015.11.01 15:09 신고

    빈프로젝트를 생성했는데요
    debug랑 release대신
    리소스파일 소스파일 외부종속성 헤더파일
    이렇게 있을경우 어떻게 해야되나용?

  21. 이경헌 2016.01.18 18:04 신고

    안녕하세요.
    OpenCV 2.4.9 를 글을 따라서 설치해보았습니다.
    경로설정도 ;D:\opencv\build\x86\vc10\bin; 이렇게 했고, 다른 부분들도 똑같이 해줬습니다.
    C:\Users\kyungheon\Documents\Visual Studio 2010\Projects\3D스캐너
    그리고 여기에 3456 X 2304 JPG 파일을 저장했구요.

    하지만 컴파일( Ctrl + F5 )을 해보면
    1>------ Build started: Project: 3D스캐너, Configuration: Debug Win32 ------
    1>Build started 2016-01-18 오후 6:03:40.
    1>InitializeBuildStatus:
    1> Touching "Debug\3D스캐너.unsuccessfulbuild".
    1>ClCompile:
    1> All outputs are up-to-date.
    1>ManifestResourceCompile:
    1> All outputs are up-to-date.
    1>LinkEmbedManifest:
    1> 3D스캐너.vcxproj -> C:\Users\kyungheon\Documents\Visual Studio 2010\Projects\3D스캐너\Debug\3D스캐너.exe
    1>FinalizeBuildStatus:
    1> Deleting file "Debug\3D스캐너.unsuccessfulbuild".
    1> Touching "Debug\3D스캐너.lastbuildstate".
    1>
    1>Build succeeded.
    1>
    1>Time Elapsed 00:00:03.60
    ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

    빌드가 되었는데 cmd 창에 아무것도 안뜹니다.
    어떤 오류인지.. 왜 이런증상이 뜨는지 잘 모르겠습니다..
    도와주시면 정말 감사하겠습니다

영상처리 행렬에 관련된 연산과 영상에 관한 연산을 쭉 정리해 보았습니다.
아직 계속 정리중입니다..

cvAbs : 행렬의 모든 원소들의 절대값을 구한다.

void cvAbs( const CvArr* src, CvArr* dst );

  -> src 행렬 내의 모든 원소의 절대값을 계산하여 그 결과를 dst 행렬에 저장한다.


cvAbsDiff : 두 행렬의 차를 구하고, 결과행렬의 모든 원소들의 절대값을 구한다.

void cvAbsDiff( const CvArr* src1, const CvArr* src2, CvArr* dst );

  -> src1으로부터 src2 행렬을 뺀 다음 그 절대값을 dst 행렬에 저장한다.

 

cvAbsDiffS : 행렬에서 원소 단위로 스칼라값을 빼고, 그 절대값을 구한다.

void cvAbsDiffs( const CvArr* src, CvArr* dst, CvScalar value );

  -> src 행렬의 모든 원소로부터 상수값 value를 빼고, 그 절대값을 dst 행렬에 저장한다.

 

 

cvAdd : 두 행렬의 원소끼리 덧셈 연산을 수행한다.

void cvAdd( const CvArr* src1, const CvArr* src2, CvArr* dst, const CvArr* mask = NULL ); 

  -> src1의 모든 원소값에 src2의 원소값을 더한 결과를 dst 배열에 저장한다. 만약 mask가 NULL이 아니라면 mask 행렬에서 0이 아닌 원소가 있는 위치에서만 덧셈 연산을 수행한다.


cvAddS : 하나의 행렬과 스칼라값을 원소 단위로 더한다.

void cvAddS( const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask = NULL );

  -> 하나의 행렬인 src에 상수값 value를 더한다.

 

cvAddWeighted : 두 행렬에 가중치를 부여한 후 더한다. (알파 블렌딩)

void cvAddWeighted( const CvArr* src1, double alpha, const CvArr* src2, double beta, double gamma, CvArr* dst );

  -> 하나의 영상과 다른 영상을 서로 합성하여 반투명한 형태의 영상을 만든다.(보충자료 요망)

 

cvSub : 두 행렬의 원소끼리 뺄셈 연산을 수행한다.

void cvSub( const CvArr* src1, const CvArr* src2, CvArr* dst, const CvArr* mask = NULL );

  -> src1의 모든 원소값에서 src2의 원소값을 빼서 그 결과를 dst 배열에 저장한다. 만약 mask가 NULL이 아니라면 mask 행렬에서 0이 아닌 원소가 있는 위치에서만 뺄셈 연산을 수행한다. mask는 8비트 데이터 타입이어야 한다.

 

cvSubS : 하나의 행렬에서 스칼라값을 뺀다.

void cvSubS( const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask = NULL );

  -> 하나의 행렬 src에서 상수값 value를 뺀다.

 

cvSubRS : 스칼라값으로부터 행렬의 원소값을 뺀다.

void cvSubRS( const CvArr* src, CvScalar value, CvArr* dst, const CvArr* mask = NULL );

  -> cvSubs와 반대로 주어진 상수값 value로부터 행렬의 모든 원소값을 뺀 결과를 dst에 저장한다.


cvDiv : 두 행렬의 원소끼리 나눗셈 연산을 수행한다.

cvMul : 두 행렬의 원소끼리 곱셈 연산을 수행한다.


cvSum : 행렬의 모든 원소값의 합을 구한다.

CvScalar cvSum( CvArr* arr );

  -> 입력행렬 arr의 모든 원소값의 합을 구한다. cvSum() 함수는 다채널행렬에도 적용될 수 있다.(반환타입이 CvScalar) 각 채널의 합은 CvScalar 반환값의 각 원소에 저장된다.


cvAvg : 행렬의 모든 원소값의 평균을 구한다.

CvScalar cvAvg( const CvArr* arr, const CvArr* mask = NULL )

  -> arr 내부에 있는 원소값의 평균을 계산한다. 만약 mask가 NULL이 아니면, mask에서 0이 아닌 값을 갖는 위치에 있는 원소들만 이용하여 평균을 계산한다.

 

cvAvgSdv : 행렬의 모든 원소값의 평균과 표준편차를 구한다.


cvAnd, cvAndS


cvCalcCovarMatrix : n차원 벡터들의 집합으로부터 공분산행렬을 계산한다.


cvCmp : 두 행렬의 모든 원소에 대하여 선택된 비교 연산을 수행한다.

cvCmpS : 행렬과 스칼라값 사이에 선택된 비교 연산을 수행한다.


cvConvertScale : 선택적으로 값을 증감하면서 행렬 타입을 변경한다.

cvConvertScaleAbs : 선택적으로 값을 증감하고, 절대값으로 바꾼 후 행렬 타입을 변경한다.


cvCopy : 행렬의 원소들을 다른 행렬로 복사한다.

void cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask = NULL )

  -> 하나의 영상을 다른 영상으로 복사할 때 사용한다. 두 배열은 동일한 자료형, 동일한 크기, 동일한 차원 수를 갖고 있어야 한다. 만약 mask가 NULL이 아니면, mask에서 0이 아닌 위치에서의 값만 복사된다.


cvCountNonZero : 행렬에서 0이 아닌 원소의 개수를 반환한다.


cvCrossProduct : 두 개의 3차원 벡터에 대한 외적을 계산한다.


cvCvtColor : 행렬의 채널을 하나의 색 공간에서 다른 색 공간으로 변환한다.

void cvCvtColor( const CvArr* src, CvArr* dst, int code );

  -> 특정 색 공간을 다른 색 공간으로 변환한다. 채널의 개수는 변할 수 있으나 영상의 데이터 타입은 동일해야 한다. 세 번째 인자인 code 값에 의해 변환 방법이 결정된다.


cvDet : 정방행렬의 행렬식의 계산한다.


cvDotProduct : 두 벡터의 내적을 계산한다.


cvEigenVV : 정방행렬의 고유벡터와 고유값을 계산한다.


cvFilp : 선택한 축을 기준으로 행렬을 뒤집는다.

void cvFlip( const CvArr* src, CvArr* dst = NULL, int flip_mode = 0 );

  -> 영상을 x축, y축, 또는 양축 모든 방향으로 뒤집는다. flip_mode가 0으로 설정되면 x축을 기준으로 뒤집는다. flip_mode가 양수이면 y축을 기준으로 뒤집어지고, 음수이면 양축 모두를 기준으로 뒤집는다.


cvGEMM : 범용적인 행렬의 곱셈 연산을 수행한다.


cvGetCol : 행렬에서 하나의 열을 추출하여 벡터 형태로 반환한다.

cvGetCols : 행렬에서 여러 개의 인접한 열을 추출하여 행렬 형태로 반환한다.

cvGetRow : 행렬에서 하나의 행을 추출하여 벡터 형태로 반환한다.

cvGetRows : 행렬에서 여러 개의 인접한 행을 추출하여 행렬 형태로 반환한다.


cvGetDiag : 행렬에서 대각 성분을 벡터 형태로 반환한다.


cvGetDims : 행렬의 차원 수를 반환하고 선택적으로 각 차원의 크기를 알려준다.

cvGetDimSize : 행렬에서 지정된 차원의 크기를 반환한다.


cvGetSize : 2차원 행렬의 크기를 CvSize 타입으로 반환한다.

CvSize cvGetSize( const CvArr* arr );

  -> 행렬의 크기를 반환한다. 2차원 형태인 영상과 행렬에 대해서만 사용가능하다. 반환값이 CvSize 이기 때문에 동일한 크기의 영상이나 행렬을 새로 생성할 때 주로 사용된다.

 

cvGetSubRect : 행렬에서 일부 사각형 영역을 추출한다.


cvInRange : 행렬의 원소값이 두 행렬로 지정된 범위 안에 존재하는 지를 검사한다.

cvInRangeS : 행렬의 원소값이 두 스칼라값으로 지정된 범위 안에 존재하는 지를 검사한다.


cvInvert : 정방행렬의 역행렬을 구한다.


cvMahalonobis :  두 벡터 사이의 마할라노비스 거리를 계산한다.


*마할라노비스 거리 : 각각의 케이스가 여러가지 변인(variables) 중심값 (평균값, mean)들로 이루어진 중심 (centroid) 에 대해서 갖는 거리를 말한다. 개념적으로 살펴보면, 여러변인을 동시에 이용하여 살펴보는 테스트 (multivariate) 경우에 각각의 중심값을 중앙에 교차시켜 케이스 값들을 나열해보면 일종의 군집을 이루게 되는데, Mahalanobis distance는 특정 케이스의 값이 여기서 심하게 벗어났는가를 보기 위한 거리값이다.


cvMax : 두 행렬에서 큰 값을 골라서 새 행렬을 만든다.

cvMaxS : 행렬의 원소값과 스칼라값 중에서 큰 값을 골라서 새 행렬을 만든다.

cvMin : 두 행렬에서 작은 값을 골라서 새 행렬을 만든다.

cvMinS : 행렬의 원소값과 스칼라값 중에서 작은 값을 골라서 새 행렬을 만든다.

cvMinMaxLoc : 행렬 내부에서 최대값과 최소값을 구한다.


cvMerge : 여러 개의 단일 채널 영상을 모아서 다중 채널 영상을 생성한다.


cvNot : 행렬의 모든 원소값의 비트를 반전한다.


cvNorm : 단일 행렬의 전체 놈 또는 두 행렬 사이의 거리 놈을 계산한다.


cvNormalize : 행렬을 정규화하거나 특점 범위로 원소값을 매핑한다.


cvOr : 두 행렬의 비트 단위 OR 연산을 수행한다.

cvOrS : 한 행렬과 스칼라값 사이의 비트 단위 OR 연산을 수행한다.


cvReduce : 2차원 행렬을 지정된 방법에 의해 벡터로 변환한다.


cvRepeat : 행렬을 타일 형태로 깔아서 새 행렬을 생성한다.


cvSet : 행렬의 모든 원소를 주어진 값으로 설정한다.

cvSetZero : 행렬의 모든 원소를 0으로 설정한다.

cvZero : 행렬의 모든 원소를 0으로 설정한다. cvSetZero()와 동일하다.

cvSetIdentity : 행렬의 대각 성분은 1로, 나머지 원소들은 0으로 설정한다.


cvSolve : 선형 방정식의 해를 구한다.


cvSplit : 다중 채널행렬을 여러 개의 단일 채널행렬로 분할한다.


cvSVD : 2차원 행렬의 특이값 분해(SVD)를 수행한다.


cvSVBkSb : 특이값 역치환을 계산한다.


cvTrace : 행렬의 대각합(trace)을 구한다.


cvTranspose : 행렬의 행과 열을 서로 교환한 전치 행렬을 구한다.


cvXor : 두 행렬의 원소 사이의 비트 단위 XOR 연산을 수행한다.

cvXorS : 행렬과 스칼라 사이의 비트단위 XOR 연산을 수행한다.

웹캠을 이용한 영상처리를 하면서 자주 사용하는 함수를 정리해보았습니다. 가장 기본적으로 쓰이는 함수이지만 어떠한 구조로 이루어져있고 어떠한 기능을 하고 있는지 자세히 알아보도록 하겠습니다.

데이터 구조

□ CvCapture : 비디오 캡쳐 함수를 사용하기 위한 데이터 구조

□ CvVideoWriter : 비디오 저장 함수를 사용하기 위한 데이터 구조

시작 / 해제

□ cvCaptureFromCAM : 카메라에서 프레임 캡쳐 

CvCapture* cvCapturefromCAM(int index);
(index는 0번째, 1번째 카메라를 가리키는 변수)

□ cvCaptureFromFile : 비디오 파일에서 프레임 캡쳐 시작

CvCapture* cvCapturefromFile(const char* filename);

□ cvReleaseCapture : 할당한 CvCatpure 데이터 구조를 해제한다.

void cvReleaseCapture(CvCapture** capture);

프레임 가져오기

□ cvGrabFrame  : 카메라 또는 파일에서 프레임을 잡는다.

int cvGrabFrame(CvCapture* capture);

□ cvRetrieveFrame : cvGrabFrame에서 잡은 프레임에서 영상 데이터를 가져온다.

IplImage* cvRetrieveFrame(CvCapture* capture);

□ cvQueryFrame : 카메라 또는 파일에서 잡은 프레임을 풀은 영상 데이터를 반환한다. 
  실제로 cvGrabframe() 함수와 cvRetrieveFrame() 함수의 연속된 순서와 같다.

IplImage* cvQueryFrame(CvCapture* capture);

프레임 저장하기


□ cvCreateVideoWriter : 비디오 파일 작성자(video file writer)를 생성한다.


CvVideoWriter* cvCreateVideoWriter(const char* filename, int fourcc, double fps, CvSize frame_size, int is_color = 1);


□ cvWriteFrame : 비디오 파일 작성자에 프레임을 저장한다.


int cvWriteFrame(CvVideoWriter* writer, const IplImage* image);


□ cvReleaseVideoWriter : 비디오 파일 작성자를 해제한다.


void cvReleaseVideoWriter(CvVideoWriter** writer);


+ Recent posts