OpenCV 를 사용하다보면 이미지를 저장하는 배열의 형태가 사람마다 각각 다를 경우를 겪으신  분들이 있을겁니다.

 

예를들어 다른 선구자들이 만들어 놓은 소스코드를 참고하고자 할때, CvMat, cv::Mat, IplImage, CvArr 등등 각각 다른 포멧을 사용하는것을 보신 분들이 있을텐데요,

 

저도 이러한 경우를 자주 겪어서 정리 겸, 정보 공유 겸, 오랫만에 포스팅 겸.. 해서 글을 적게 되었네요.

 

 

 

 

//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);

 

 

 

 

 

 

 

 

Referenced:

http://docs.opencv.org/index.html

http://v_lovepooh_v.blog.me/20170546845

http://blog.naver.com/makerslee/30146885035

http://codens.info/386

http://www.cyworld.com/fish_blog/4695785

Posted by Tommy™
,

컴퓨터를 포멧 후 새로 Visual studio 2012를 설치 후 필요한 업데이트를 완료, 그리고 프로젝트를 로드하는데, 갑자기 처음보는 에러 문구가 뜬다.

 

"activitylog.xml error" 하면서 프로젝트가 로드가 안된다나..

 

문제가 뭔가 싶어 이리저리 구글링하다가 찾은 원인은 "플러그인의 충돌"떄문에 일어난 문제라고 한다.

 

그리고 찾은 솔루션은 다음과 같다.

 

 

 

1. Visual studio 2012 의 메뉴에서 도구 -> 확장 및 업데이트 선택

 

2. Visual assist x 사용안함 선택

 

3. 재시작

 

4. 다시 도구 -> 확장 및 업데이트 항목으로 가서 visual assist x 사용함 설정

 

4. 재시작

 

 

 

아마도 어떠한 문제 때문이었는지는 모르겠지만, 다음과 같이 처리함으로써 해당 오류를 해결할수 있엇다.

 

 

 

 

 

참고 : http://bangcfactory.tistory.com/133

 

 

Posted by Tommy™
,

두개의 형변환방법이 엄청 자주 사용된다.

 

사용법은 아래와 같이 아주 간단!

 

 

CString -> int

int형 변수 = _ttoi( CString 변수 );
_ttoi()를 이용


int -> CSting
CString 변수.Format( _t("%d"), int 변수 );
CString의 Format() 메소드를 이용

 

출처 : http://tasia.tistory.com/129

 

 

Posted by Tommy™
,

Map

 

map<key, value>   -> key에는 정렬될 값, value에는 필요한 값 (Key값을 기준으로 함께 쌍으로 저장 및 정렬됨)

 

중복된 키값을 허용 X

 

map 정렬방식

 

map<int, string, string.less<int>>    -> map의 오름차순 (그냥 map<key, value> 사용시 오름차순)

map<int, string, string.greater<int>>  -> map의 내림차순

 

 

map 추가방식

 

map<int, string> strMap;

strMap.insert( make_pair( 5, "Rjwu") );

strMap.insert( make_pair<int , string> (5, "RJwu")  );

 

삭제방식

 

strMap.erase(1);          키값 1의 Pair 가 사라짐

 

검색방식( 반환타입은 iterator)

 

map<int, string, string.greater<int>> :: iterator    iter;

iter = strMap.find(7);

 

cout << iter->first << "\t" << iter->second << endl;          //first 는 키값, second 는 데이터

 

 

multiMap

 

map과 달리

strMap[5] = "기륜"; 이런방식의 키값과 데이터 추가가 안된다.

또한 multiMap은 map 과 달리 중복된 키값을 허용한다. map 은 중복된 키값이 들어오면 나중에 들어온 pair 가 먼저것을 밀어냄

 

multimap 은 중복된 키값에 대하여 find로 검색시 먼저 들어온 데이터를 우선시한다.

multimap 은 중복된 키값에 대하여 erase 로 삭제 시 해당 키값에 해당하는 Pair 를 모두 삭제한다.

 

 

Include header

 

#include <map>

 

<map>만 추가해줘도 map, multimap 둘다 사용이 가능

 

#include <functional>

 

오름차순, 내림차순 정렬시, std::greater<key>, std::less<key> 를 사용하기 위한 헤더파일

 

 

http://stackoverflow.com/questions/16567699/stdgreater-not-defined-in-msvc2012

 

 

 

 

 

위의 블로그를 참고 했습니다.  (몇몇 필요한 내용은 추가 및 수정)

 

 

실제 사용 예 및 소스코드

 

Kinect의 depth값을 깊이 단위로 내림차순 정렬을 해야하는 경우가 발생했다.

 

처음에 map을 사용하셨지만, 치명적인 문제점이 key값이 중복이 안된다는 점!

 

depth 값이 중첩이 되는 값들은 저장이 안되고 날아가버리는 치명적인 문제가 발생했다.

 

하지만 multimap중복 ket값이 사용 가능하다.

 

그래서 map의 key 부분에 depth 값을, value값에 만든 구조체를 삽입하여 정렬했다.

 

 

//내림차순 정렬

multimap<float, RGBD, greater<float>> m_mapRGBD;

 

for( int h = 0 ; h < KINECT_RGBD_HEIGHT_MAX ; h ++ )
{
  for( int w = 0 ; w < KINECT_RGBD_WIDTH_MAX ; w ++ )
  {

    m_mapRGBD.insert( make_pair( rgbd.z, rgbd ) ) ;

  }

}

 

 

따라서 결과적으로 m_mapRGBD안에 depth값을 기준으로 자동 내림차순 정렬이 되어 문제를 해결하였다.

 


 

Posted by Tommy™
,

아주 유용한 소스코드일듯하다.

 

MFC에서 CString형을 이용하여 string을 쉽게 컨트롤 할 수 있다.

 

이때 경로, 파일명, 확장자 등을 구분하여 출력해야하는 상황이 있는데, 이때 해당 소스코드를 활용하면 될듯하다.

 

 

// Type
// 0: 파일 경로만 복사
// 1: 파일 이름만 복사
// 2: 파일 확장자 복사
// 3: 확장자를 뺀 파일명 복사


CString strClip(CString str, int nType)
{
 //파일 Full Path를 복사
 TCHAR szTmp[256];
 StrCpy(szTmp, str);

 //파일의 경로만 복사.
 PathRemoveFileSpec(szTmp);
 CString strTmp = szTmp;

 if(nType == 0)
  return strTmp;

 //파일 이름만 복사
 strTmp = str.Right(str.GetLength()-strTmp.GetLength()-1);

 if(nType == 1)
  return strTmp;

 //파일 확장자 복사
 int i = strTmp.ReverseFind('.');
 CString strTmp2;
 if(i > -1)
 {
  strTmp2 = strTmp.Right(strTmp.GetLength()-i-1);
 }
 else
 {
  strTmp2 = _T("");
 }
 
 
 if(nType == 2)
  return strTmp2;

 //확장자를 뺀 파일명을 복사
 strTmp = strTmp.Left(i);
 if(nType == 3)
  return strTmp;


 return _T("");
}

 

단지 디렉토리 경로일 경우는 파일명에 마지막 디렉토리를 리턴하게 된다.

 

 

참조 : http://blog.naver.com/just720?Redirect=Log&logNo=40206748318

 

 

 

 

 

 

 

 

 

2013/11/26 - [[ Topics ]/MFC] - MFC Edit control 에서 실수형 값 가져오는방법

 

2013/09/05 - [[ Topics ]/MFC] - error C2589 에 대한 고찰과 문제 해결방법

 

2013/07/30 - [[ Topics ]/MFC] - MFC Dialog창을 modaless할때 포커스 옮기는법

 

2012/09/04 - [[ Topics ]/MFC] - MFC 새다이얼로그를 생성시 OnDestroy() 경고 및 Memory Leaks

 

2012/09/03 - [[ Topics ]/MFC] - MFC 다이얼로그 기반 OnIdle()과 KickIdle() 그리고 modaless

 

2010/07/29 - [[ Topics ]/MFC] - MFC에서 글자 출력

 

Posted by Tommy™
,