이번에 OpenCV라이브러리를 빌드하는 과정에서 생긴 문제를 해결한 경험에 비추어 작성하고자한다. 우선 주의할점을 적는것이라 내용이 조금 빠질 수 있는 부분이 있지만 그런 부분은 적당히 채워나가기로...

1. 현재 Visual Studio의 빌드를 지원하는지 확인
대부분 CMake는 되고 실재로 비주얼 스튜디오에서 빌드가 안 되는 경우. 이런경우는 원인 찾기가 생각보다 힘들다. 개발자들이 VS적정버전에 대해 별도로 공지를 안 해주는 경우가 많기때문에...

예를 들어 OpenCV같은경우는 4버전 이후부터는 C++ 11 이전버전은 지원하지 않기때문에 VS2013 사용자들은 4버전 미만의 버전을 선택해야 한다. 문서를 덜 읽어서 못 찾았을 수도 있지만 아무래도 개발자용이기 때문에 생략되어 있거나 복잡하게 쓰인 경우가 많기도 하고

2. 에러가 발생하는 부분은 과감하게 제거
이거 없으면 안되지 않을까?라는 생각은 빨리 접고 CMake Configration & Generate를 다시 진행한 후에 빌드를 시도해보는것이 낫다. 추가는 나중에 빌드 성공한 후에 해도 충분...

3. 가능하면 관리자 권한이 필요없는 폴더를 사용
CMake도 관리자, VS도 관리자로 켜서 하는 방법도 있지만 가장 좋은 방법은 둘 다 관리자 권한이 필요없는 상태라고 생각

4. 인터넷에 있는 사용법에 너무 매달리지 않기
예전에 VTK 빌드할때도 그랬던거같은데 애초에 모든 버전을 다 똑같이 맞출게 아니면 큰 의미가 없다고 생각한다. 특히 한국 블로그에 써있는 순서형 가이드는 더더욱...

버전이 별로 안 달라도 디테일한 부분이 완전 달라져서 빌드가 안 되는 경우도 있어서 시간날리기 딱 좋은 시츄에이션. 적당히 참고만 하고 직접 빌드해서 문제가 되는 부분만 따로 검색하거나 집중 리뷰해서 빠르게 쳐나가는쪽이 이해에도 도움이 되고 속도도 더 빠르다.

C#에서는 유용하게 잘 써먹었던 Singleton이였지만 개인 프로젝트를 C++로 진행한 적이 없었기 때문에 C++에서는 사용할 일이 없어 지금까지 외면해왔지만 


업무상으로 C++에서 코드를 작성해야 하는데 해당 프로젝트에 Singleton을 쓰면 좋을 것 같아서 검색하던 도중 좋은 글을 찾았다.





http://vallista.tistory.com/entry/1-Singleton-Pattern-in-C



일단 매우 기초적으로 구성할 수 있는 Singleton부터 Tamplete을 이용한 Singleton까지 다양한 Singleton들이 존재하고 


개인적으로는 Tamplete을 이용한것이 가장 깔끔한것 같다. 일단 포인터와 메모리 관리가 가장 편하고 한번 만들어두면 다른 곳에서도 활용할 수 있으니...





http://gamasotworld.blogspot.kr/2013/12/programming_29.html



위 글은 싱글톤 사용 이유와 단점에 대해 서술되어있으니 한번 읽어보고 내가 진행하는 프로젝트에 꼭 싱글톤이 필요한지에 대해 생각해보는것도 좋을 듯 싶다.

일단 알파값을 지정하지않고 DICOM파일을 3D모델로 변경하면 피부부터 시작해서 뼈까지 모든 부분이 표시되기때문에



만약 STL파일등의 3D오브젝트 파일로 해당 파일을 빼내려면 투명화 된 부분의 데이터를 제거하는 작업이 필요하다고 본다.




그리고 STL파일의 특성상 있을수도 있고 아닐수도 있습니다 같은 애매한 상태는 존재할 수 없기때문에 경계선을 명확하게 그어줘야하는데


일단 지금 내가 구현해본 형식 내에선 명확한 경계를 그을 수 없다는 점도 문제. 아마 이 부분은 VTK의 교집합, 차집합, 합집합 등의 기능들을 활용하면 어느정도는 구현할 수 있으리라고 생각한다.



지금도 특정 포인트를 기준으로 알파값과 색을 지정하는 형태니까 일정 범위 내에서 특정 알파값을 가진 부분의 오브젝트를 따로 때내어 복사할 수 있으면 해결할 수 있지않을까 하는 생각




하지만 이미 프리웨어 등으로 풀리고 있는 소프트웨어쪽이 좀 더 성능도 좋고 각 장기간의 색구분도 깔끔하게 되는 편이기때문에 혼자서 아무리 고민해도 더 월등하거나 버금가는 성능의 프로그램은 나오기 힘들겠지...



http://vtk.1045678.n5.nabble.com/Make-3D-Modelling-from-2D-DICOM-td5727316.html




해당 스레드에서는 vtkDICOMImageReader를 사용하라고 되어있지만 아마 해당 클래스는 정상작동을 안할 가능성이 높다. 어떤 파일을 읽어들일수 있는지가 의문일 정도...





뭐 대충 찾아보면 압축되어있는 파일은 읽지못하고 그 Mac에서만 돌릴 수 있는 프로그램으로 풀어준 후에 읽어와야한다는것 같지만


ITK도 해보고 별의 별 짓을 다 했는데 해당 파트는 결국 다 무위로 돌아갔고


찾아낸 간단한 대안으로 GDCM(http://gdcm.sourceforge.net/)이라는것을 사용하여 DICOM이미지를 읽어들일 수 있다. CMake하는데도 손이 덜 가고 빠르게 진행이 된다.






다만 GDCM쪽의 DICOM 리더에서는 폴더째로 읽어들이는 매소드가 포함되어있지 않은 것으로 보여 별도의 파일목록 작성 매소드를 작성해서 작성된 파일 리스트를 복수의 DICOM파일을 읽어들이는 메소드로 넘겨줘야한다.

VTK라이브러리를 CMake를 이용하여 빌드하는것과 예제 프로그램을 빌드하는것까지는 성공하였으나


예제가 정상적으로 실행이 안되는 경우(포인터 초기화가 안되는 문제)에 대해....





처음에는 CMake 설정을 잘못 잡았나부터 시작해서 여러가지 원인을 생각했었으나


문제는 인터넷에 예제로 올라와있는 VTK버전이 지금의 VTK버전과 다른부분에서 문제가 발생한것이였다.



추측으로는 VTK 기존버전(6.0미만)에서는 모듈의 초기화를 자동적으로 해주는것으로 보이나


6.0이상의 버전에서는 vtk관련 클래스를 사용하기 전에 별도의 define 매크로를 사용해서 모듈초기화를 해줘야 하는것같다.




위와 같은 이유로 예제의 stdafx.h 파일에 include와 define들을 더 추가해줘야한다.



일단 vtk소스에 동봉되어있는 샘플의 stdafx.h파일의 맨 마지막에 해당 줄들을 추가하여 문제를 해결하였다.






문제 해결법 출처:


http://www.vtk.org/Wiki/VTK/VTK_6_Migration/Factories_now_require_defines


http://public.kitware.com/pipermail/vtkusers/2014-July/084426.html

C#에서는 바이트를 다루는 클래스가 따로 존재하지만 C++에서는 그런 클래스가 따로 있는것같지는 않다. 검색해보면 다 손수 코드를 짜서 변환해야하는듯


memcpy를 사용한다.





일단은 C#으로 바이너리를 ASCII로 바꾸는부분을 대체하고 있지만 파일 자체를 읽어서 화면에 출력하는 것은 성공적


다만 문제는 시간인데 대략 1분당 8만개의 삼각형을 로드하는 속도라 실제로 이 이미지를 로드하는데도 6분정도의 시간이 소모되는


그리고 그 facet normal인가 뭐 하튼 광원에 대한 고려가 전혀 되어있지않기때문에 윤곽은 볼 수 있지만 디테일한 부분은 전혀 볼수 없는 문제와 축 기준의 회전은 충분히 가능한 부분이지만 아직 자유롭지가 않고 결정적으로 지금은 예제를 따라한 수준이라 카메라를 상하로 이동시키지 못하기때문에 꽤나 제한적인 뷰가 된다.

http://andrew0409.tistory.com/101



http://www.codeproject.com/Articles/2477/Multi-threaded-Client-Server-Socket-Class


찾아보니 일반적인 통신은 http로도 괜찮다고 하던데 채팅 프로그램이나 mmorpg같은 경우에는 소켓 통신이 필요하다고 한다


http://kaludin.egloos.com/2461942




추가 선언이 필요

'Programing > C++' 카테고리의 다른 글

[C++] OpenGL과 STL 사용  (0) 2016.05.26
[C++]소켓 통신  (0) 2016.04.06
[C++]Visual Studio 2013 이후버전에서 MySQL 연동하기  (0) 2016.03.28
[MFC][C++]문자열 복사  (0) 2016.03.10
[MFC]COleDBRecordView::OnGetRowset 재정의  (0) 2016.03.09

http://passmeby30.tistory.com/66


라이브러리 참조가 너무 번거롭다...

'Programing > C++' 카테고리의 다른 글

[C++]소켓 통신  (0) 2016.04.06
[C++]static 선언시 주의해야 할 점  (0) 2016.03.30
[MFC][C++]문자열 복사  (0) 2016.03.10
[MFC]COleDBRecordView::OnGetRowset 재정의  (0) 2016.03.09
[C++]DLL 연결  (0) 2016.02.18

예전 책을 보면 strcpy가 자주 보이지만 wcscpy를 쓰는것이 더 좋아보일때가 있다


하지만 MFC에는 CString 이 있으므로 CString으로 변수를 선언한다음 직접 할당해주거나 Format메소드로 문자열을 재선언하는 편이 속편하다.

https://msdn.microsoft.com/en-us/library/7ya51z3f.aspx


무조건 재정의를 해줘야한단다




CRowset* CTapeView::OnGetRowset()


이렇게 쓰면 안되고



CRowset< >* CTapeView::OnGetRowset()


이렇게 써야 정상처리



그리고 지금 예제로 사용하고 있는 책에 문제가 좀 있는데 VS C++ 6에서는 문제가 없겠지만 상위 버전(Visual Studio 2013)에선 문제가 발생함




이렇게 재정의 하도록 예제가 짜여져 있으나 실은



이렇게 작성해야 정상적으로 작동하게 된다.

http://stdesignstar.tistory.com/entry/03-DLL%EC%9D%98-%EC%97%B0%EA%B2%B0

 

 

C#보다 참조가 번거로운것 같다...

https://social.msdn.microsoft.com/Forums/en-US/408159fd-563b-478c-9880-b47658f9e085/what-is-the-equivalent-of-c-region-in-c?forum=vcgeneral


C#에서는


#region 코멘트


//내용


#endregion




이렇게 사용하지만 C++에서는




#pragma region


//내용


#pragma endregion 코멘트



혹은


#pragma region 코멘트


//내용


#pragma endregion



이렇게 사용

'Programing > C++' 카테고리의 다른 글

[MFC][C++]문자열 복사  (0) 2016.03.10
[MFC]COleDBRecordView::OnGetRowset 재정의  (0) 2016.03.09
[C++]DLL 연결  (0) 2016.02.18
[MFC] MFC에서 DC 클래스 얻기 및 내부 구조  (0) 2016.02.04
[MFC]메뉴 언더라인  (0) 2016.02.03

http://wooya510.egloos.com/942330



CClientDC와 CPaintDC

'Programing > C++' 카테고리의 다른 글

[MFC][C++]문자열 복사  (0) 2016.03.10
[MFC]COleDBRecordView::OnGetRowset 재정의  (0) 2016.03.09
[C++]DLL 연결  (0) 2016.02.18
[C++]C++에서 #region 사용하기(#pragma region)  (0) 2016.02.04
[MFC]메뉴 언더라인  (0) 2016.02.03

http://stackoverflow.com/questions/29473133/underlining-first-letter-of-label-c-underline-doesnt-show

+ Recent posts