OverView 


OpenCV (Open Source Computer Vision Library)  & Computer vision 


Reference Site

- source forge(http://sourceforge.net/projects/opencvlibrary)


Patch Once or twice of year Site


http://sourceforge.net/cvs/?group_id=22870


http://SourceForge.net/projects/opencvlibrary


Download Site


http://opensource.org  ( Computer Vision Library)





Background knowledge


1. algebra


2. basic matrix operation


3. Gaussian distribution


4. Bayes' law


5. least-squares optimization


6. C language


7. C++ language


8. marchine learning



OpenCV be borned Intel



Rainer Lienhart


Jean-Yves Bouguet


Radek Grzeszczuk

Ara Nefian


// 대강 훑고 넘어가기 


1. IPP (Intel Integrated Performance Primitives) 라이브러리


OpenCV 는 최적화된 C언어로 되어있으며 멀티코어 프로세서의 장점을 활용할수 있다. 


추후 인텔(Intel) 아키텍처(architecture)에서 최적화하기 위해서는 다양한 알고리즘에 대한 저수준 최적화 루틴을 갖고있는


인텔 통합 성능 프리미티브 (IPP) 라이브러리를 구입하여 설치 할 수도 있다. IPP가 서치되어있다면 OpenCV 는 자동으로 IPP 라이브러리에서 적절한 함수를 찾아서 사용 한다. 



OpenCV 에서는 500개가 넘는 함수들로 구성되어있으며


불량검사,의료 영상, 보안, 사용자 인터페이스,카메라 보정, 스테레오 비전, 로봇 등 다양한 분야에서 사용할 수 있다.


컴퓨터 비전은 기계 학습과 함꼐 사용되는 경ㅇ가 많기 때문에 OpenCV 는 보편적 용도의 기계학습 라이브러리


(MLL : Machine Learning Library)를 포함하고 있다.



OpenCV는 많은 곳에서 사용 되어진다.


. 카메라 보정(camera calibration)


. 영상 이어붙이기(image stitching) 등등



OpenCV 는 오픈소스로 완전히 공개 되어있기 때문에 상업적인 프로그램을 만들 때 사용하여도 무방하다.



OpenCV 관련된 대규모 커뮤니티


http://groups.yahoo.com/group/OpenCV


네이버 OpenCV Korea


http://cafe.naver.com/opencv









'개발일지(Platform & Library) > OpenCv(2.x)' 카테고리의 다른 글

2. OpenCV  (0) 2016.09.22
기본 샘플  (0) 2016.08.08
opencv-3.1.0 - Visual Studio 2013 세팅하기  (0) 2016.08.08
OpenCV 버전별 사용하는 객체 상호 변환  (0) 2016.06.28

#include <opencv2/core/core.hpp>  

#include <opencv2/highgui/highgui.hpp>  

#include <iostream>  



using namespace cv;

using namespace std;


int main(int argc, char** argv)

{


Mat image;

image = imread(이미지파일, IMREAD_COLOR);   // Read the file  


if (!image.data)                              // Check for invalid input  

{

cout << "Could not open or find the image" << std::endl;

return -1;

}


namedWindow("Display window", WINDOW_AUTOSIZE);// Create a window for display.  

imshow("Display window", image);                   // Show our image inside it.  


waitKey(0);                                          // Wait for a keystroke in the window  

return 0;

}

잡다한 업무 때문인지 OpenCV 를 하겠다고 한게 2.x버전이였는데 3.x버전이 되어버려서 3.1.0버전으로 세팅하게 되었다.


일단 우선 3줄 요약 식으로 해야 할일이 있다.


1. OpenCV 다운로드 하여 설치 


2. 환경변수 설정 


3. Visual Studio 설정 


3가지만 하게 되면 원하는 헤더 들을 include 하여서 사용하면 된다.


1. OpenCV 를 다운로드 한다. 


https://sourceforge.net/projects/opencvlibrary/  지금은 현 사이트에서 다운로드 받았다.


해당 아이콘이 보일텐데 해당 아이콘을 더블클릭하여 열어 준다.




OpenCV 라이브러리 들을 풀어서 놓을 곳을 지정하는데 되도록이면 C:\ 혹은 D:\이 편한거 같다. 세팅은 매번 하는게 기억도 안사라지고 도움도 되기 때문에 C:\에다가 한다.





설치가 완료되게 되면 C:\ 드라이브안에 opencv라는 폴더가 생김을 확인할수가 있다. 여기까지가 진행되면 1의 Opencv설치는 끝이 난다. 



2. 환경변수를 설정한다.

이제 설치를 완료 했기 때문에 환경 변수를 설정해주어서 해당 라이브러리 등을 사용할수가 있게 되는데 꼭 해 주어야 하는 부분이다.


우선 내컴퓨터 오른쪽 -> 속성 에 들어가면 고급 시스템 설정이라는 화면이 보인다. 누르도록 한다.


해당 창이 나오게 되면 환경변수라는 버튼이 보일것이다. 살포시 누른다.



시스템 변수 에 보면 Path  라는 것이 잇는데 편집 (I)... 을 누르게 되면 시스템 변수 편집 창이 나타나게 된다. 이 창의 변수 값의 맨 마지막에 ; 을 추가 해준후에


opencv에 위치였던  C:\opencv\build\x64\vc12\bin; 을 추가해준다.


여기까지 진행되면 2번도 완료 !


3. Visual Studio 설정한다.


이제 기본적인 베이스를 다 완료 됐다고 할수 있다. 여기에서 이제 IDE를 설정해주고 컴파일을 하기 위한 라이브러리들을 가져온다.



우선 include 파일에 대 한 경로를 지정해 주어야 하는데 프로젝트 속성 에 들어간후에


C/C++ 일반 -> 추가 포함 디렉터리 에 include 파일의 위치인 C:\opencv\build\include; 을 입력 해준다. 


링커 -> 일반 -> 추가 라이브러리 디렉터리 C:\opencv\build\x64\vc12\lib 를 입력한다.





이번엔 링커 -> 입력  추가 공속성 탭을 누르면 화살표 버튼이 나오는데 해당 버튼에서 추가 종속성에


opencv_wordl310.lib 를 입력한다. 


현재 Debug모드에서 했기 때문에 Release모드에서 바꾸고 똑같이 해주어야 한다. 








'개발일지(Platform & Library) > OpenCv(2.x)' 카테고리의 다른 글

2. OpenCV  (0) 2016.09.22
1. OpenCV OverView  (0) 2016.09.22
기본 샘플  (0) 2016.08.08
OpenCV 버전별 사용하는 객체 상호 변환  (0) 2016.06.28

 

//OpenCV 이미지 변환

//Mat & CvMat & IplImage, CvArr convert function

IplImage to->

 

IplImage* -> cv::Mat

1. Mat Mat_img(IplImage_img);

2. Mat Mat_img = cvarrToMat(IplImage_img);


 

IplImage* -> CvMat

cvGetMat( IplImage_img, &CvMat_img);

 

 

 

cv::Mat to->

 

cv::Mat -> IplImage*

IplImage *IplImage_img = new IplImage(Mat_img);

 

cv::Mat -> CvMat

CvMat CvMat_img = Mat_img; // convert directly

 

 

 

CvMat to->

 

CvMat -> IplImage*

IplImage *IplImage_img = cvGetImage(CvMat_img);

 

CvMat -> cv::Mat

Mat Mat_img(CvMat_img);

 



// 출처 



http://tommyhsm.tistory.com/113

'개발일지(Platform & Library) > OpenCv(2.x)' 카테고리의 다른 글

2. OpenCV  (0) 2016.09.22
1. OpenCV OverView  (0) 2016.09.22
기본 샘플  (0) 2016.08.08
opencv-3.1.0 - Visual Studio 2013 세팅하기  (0) 2016.08.08

extern "C"{

#include <libavformat/avformat.h>

}


#pragma comment(lib,"avformat.lib")

#pragma comment(lib,"avutil.lib")

//avutil.lib



const char *AVMediaType2Str(AVMediaType type);

const char *AVCodecID2Str(AVCodecID id);


int main(void)

{

const char *szFilePath = "파일경로"


// Init

av_register_all();



// Init to play streaming contents, 

avformat_network_init();

int ret;

AVFormatContext *pFmtCtx = NULL;


// avformat_open_input

// 1, AVFormatContext,

// 2, 파일이름

// 3, 강제로 Input Format 지정 NULL 시 자동 Input Format

// 4, demuxer 추가 옵션

ret = avformat_open_input(&pFmtCtx, szFilePath, NULL, NULL);

if (ret != 0)

{

av_log(NULL, AV_LOG_ERROR, "File [%s] Open Fail (ret: %d)\n", szFilePath, ret);

exit(-1);

}

av_log(NULL, AV_LOG_INFO, "File[%s] Open Success\n", szFilePath);

// 포맷 확인 

av_log(NULL, AV_LOG_INFO, "Format: %s\n", pFmtCtx->iformat->name);



// 해당 함수가 있어야 Duration 에서 0 값 들어 오는 경우가 생기지 않음 

// read packets of a media file to get stream information.

ret = avformat_find_stream_info(pFmtCtx, NULL);


// avformat_find_stream_info

// 1, AVFormatContext 객체 사용

// 2, Codec 옵션 지정  // 정보를 얻기 위한 미리 Data를 Decode해야 되는 경우

// 임시로 생성할 Codec을 넘겨줄 Codec 옵션을 지정 대부분 NULL

// ** avformat_find_stream_info blocking 함수 (Input Source로 Network Protocol 사용시)

// 패킷이 발견될때까지 Read하기 때문에 시간이 지연되거나, 최악의 경우 패킷이 들어오지않으면

// block 되어버리는 일이 발생할 수 있다.


if (ret < 0)

{

av_log(NULL, AV_LOG_ERROR, "Fail to get Stream Information\n");

exit(-1);

}


av_log(NULL, AV_LOG_INFO, "Get Stream Information Success\n");



// Get Stream Duration 


if (pFmtCtx->duration > 0)

{


// Dev-C++ 에서는 long long 타입 정상적으로 작동 하지않음 

// __int64 vc 에서만 쓰는 자료형 

// __int64 nn1 = 2147483647ll;

// __int64 nn2 = -2147483648ll;

// __int64 vv = 100ll;

// __int64 rr1 = nn1+vv;

// __int64 rr2 = nn2 -vv;

// size_t t1 = sizeof(long long int);

// size_t t2 = sizeof(__int64)

// long long int r1 = 

int tns, thh, tmm, tss;

// duration 값을 받았을 경우에 롱롱 타입으로(64bit) 32bit일경우에는 롱롱 타입이 지원되지않음 유의바람! 빠셍

// 

tns = pFmtCtx->duration / 1000000LL;

thh = tns / 3600;

tmm = (tns % 3600) / 60;

tss = (tns % 60);


if (tns > 0) {

av_log(NULL, AV_LOG_INFO, "Duration : %2d:%02d:%02d\n", thh, tmm, tss);

// av_log(NULL, AV_LOG_INFO, "Duration : duration %d  thh : %d \n ", pFmtCtx->duration, thh);

}


}



// 일반적인 미디어의 스트림은 Video 와 Audio 로 나누어져 있으며 두가지의 각각 스트림이 인코딩 -> 먹싱 -> 미디어 

// 미디어의 역활은 반대로 -> 디먹싱 -> 디코딩 -> Video,Audio  Source로 나타나게 된다. 

// 영상 편집 어플리케이션의경우  디먹싱 과정에서 나타나는 Elements들을 제어해서 편집을 하는 경우가 대다수 


av_log(NULL, AV_LOG_INFO, "Number of Stream: %d\n", pFmtCtx->nb_streams);


// print Stream Information


int i;

for (i = 0; i < pFmtCtx->nb_streams; i++) {

AVStream *pStream = pFmtCtx->streams[i];

const char *szType = AVMediaType2Str(pStream->codec->codec_type);

const char *szCodecName = AVCodecID2Str(pStream->codec->codec_id);

av_log(NULL, AV_LOG_INFO, "    > Stream[%d]: %s: %s ", i, szType, szCodecName);

if (pStream->codec->codec_type == AVMEDIA_TYPE_VIDEO) {

av_log(NULL, AV_LOG_INFO, "%dx%d (%.2f fps)", pStream->codec->width, pStream->codec->height, av_q2d(pStream->r_frame_rate));

}

else if (pStream->codec->codec_type == AVMEDIA_TYPE_AUDIO) {

av_log(NULL, AV_LOG_INFO, "%d Hz", pStream->codec->sample_rate);

}

av_log(NULL, AV_LOG_INFO, "\n");

}






// Close an opened input AVFormatContext

avformat_close_input(&pFmtCtx);

// avformat_close_input 

// avformat_open_input 혹은 avformat_alloc_context()

// 함수를 통해서 할당된 AVFormatContext 객체 S를 해제까지 해준다. 따로 free가 필요없다.



// Undo the initialization done by avformat_network_init

avformat_network_deinit();





return 0;



}


이상태로 돌리게 되면 함수 2개가 선언이 안되어있어서 빨간 줄이 갈텐데 

const char *AVMediaType2Str(AVMediaType type);

const char *AVCodecID2Str(AVCodecID id);

함수는 .txt로 첨부 한다. 

AvMediaType2Str_AvCodecID2str_Method.txt



'개발일지(Platform & Library) > ffmpeg' 카테고리의 다른 글

미디어 파일의 기초  (0) 2016.06.14
ffmpeg 준비 및 환경 설정(Windows)  (0) 2016.06.14

ffmpeg으로 미디어 플레이어를 만들기 전에 기본적인 미디어의 만들어지는 과정을 좀 대충 공부를 해야된다.



일단


Video Source -> Video Encoder -> Video Element

-> Muxer(Muxing)먹싱 작업 -> Media

Audio Source -> Audio Encoder -> Audio Element 




Muxing -> MultiPlexing의 약자 


1. 가공되지 않은 원본소리 (Video/Audio Source) -> Encoding 과정 -> 결과물(Video / Audio Elements)

* Encoder -> Encoder + Decoder = Codec(H.264, H.265 HEVC)

가공되지 않은 원본의 크기가 너무 크기 때문에 인코딩 과정을 거쳐야 한다. 


결과물이 나왔을 시에 (Elements) 결과물을 담기 위한 상자가 필요하다 = Container(.avi , .mkv, .ts 등등)


컨테이너 포맷과 코덱은 다른것이다. mp4에는 h.264를 권장 (컨테이너 = mp4 코덱 = h.264)


그럼 여기서 플레이어가 해주는일은 뭔가 


-> Video Element -> Video Decoder -> Video Source

Media -> Demuxer(Demuxing) 

-> Audio Element -> Audio Decoder -> Audio Source


1. 디먹싱 과정의 각각의 Elements들을 하나씩 꺼냄


2. 컨테이너(.mp4, avi 드에서 꺼낸) Elements을 디코더에 의해 디코딩 진행 -> 각각 원본 영상 및 소리로 변환


3. 이 단계에서 후처리 가능 (소리 보정 왜곡)


4. 영상과 소리를 시간에 맞게 잘 동기화하여서 화면 혹은 스피커로 출력 -> 소리시간에 맞추어 영상을 출력해주는 동기화 방법이 가장 많이 사용 된다.


이중 ffmpeeg 의 역할은 출력을 제외한 모든 과정 


을 뜻하게 된다. 




지금은 좀 미뤄 줬지만

ffmpeg 과 GUI 크로스플랫폼 (qt 등)을 이용하여서 멀티미디어 를 하나 제작해 볼까 한다.



우선 ffmpeg을 Windows 버전에서 사용해볼라 한다. 어차피 ffmpeg소스야 어디서든 똑같이 돌아가기에


문제는 없다.


//Windows 버전 Build 용 ffmpeg을 다운로드 한다.



https://ffmpeg.zeranoe.com/builds/ // ffmpeg 다운 // dev 버전과 shared 버전 다운로드 bin , include, lib 폴더만 따로 압축 풀기


1. win32-dev 파일에서는 include / lib 만 풀고


2. win32-shared 파일에서는 bin 폴더만 압축을 푼다. 


3. D:\ffmpeg 폴더를 하나 생성후 3개의 폴더를 넣어 놓는다.

이런식으로 



혹시 visual studio 2013 버전 이하라면 inttypes.h 파일을 추가해주어야 한다. 


// 다운로드 경로 https://code.google.com/p/msinttypes/


관련 정보는 


// 정보 공유 

http://trac.ffmpeg.org/wiki // 위키 


http://www.ffmpeg.org //공홈



64bit을 받았을시에


구성관리자 -> 활성 솔루션 플랫폼 -> 새로 추가하기 x64(새로운 프로젝트 생성 체크 해제) -> Visual Studio 에서 


프로젝트 플랫폼 x64로 새로 추가한다. (Visual Studio 2013 프리미엄 기준) Windows



1.   구성관리자 -> 

2. -> 활성 솔루션 플랫폼 -> 새로 만들기 -> 

3. -> 새 플랫폼 선택 x64 선택후 추가 


4. 프로젝트 플랫폼도 새로만들기 하여 64를 추가 해주어야 한다. 




여기까지 한 후에 Alt + F7 


1. 구성 속성 디버깅 -> 환경 : PATH=%PATH%;$폴더위치/bin  

-> PATH=%PATH%;D:\ffmpeg\bin


2. C/C++  추가 포함 디렉터리 (Additional Directory ) 


-> "D:\ffmpeg\include"


3. 링커    추가 라이브러리 디렉터리 


-> "D:\ffmpeg\lib"



여기까지 설정이 되었다면 ffmpeg을 windows 에서 build하기 위한 준비를 모두 끝났다고 보면 된다. 



'개발일지(Platform & Library) > ffmpeg' 카테고리의 다른 글

ffmpeg의 시작 (파일 분석)  (0) 2016.06.14
미디어 파일의 기초  (0) 2016.06.14

+ Recent posts