2015/05/27

OpenCV 드로잉 좌표 한계

OpenCV 2.9 버전을 64비트로 빌드하여 사용하는데 큰 이미지에 도형을 그리는 과정에서 이상한 현상을 보았다.


좌표값이 32768(32K)를 넘어가는 경우 도형이 그려지지 않는 문제가 있었다.


32768 값을 넘어가면 0으로 바뀌어 버려 이 지점을 포함하는 다각형을 그리는 경우 엉뚱한 도형이 그려졌다.


내부적인 좌표 한계인지는 좀 더 알아봐야 겠지만 문제의 처리가 우선이라 ROI를 지정하여 그리는 방법으로 우회를 하였다

Original Post : http://neodreamer-dev.tistory.com/746

2015/05/26

[MFC] VTK Hello World

천천히 VTK 를 공부하고 있다.


지난 번 라이브러리를 빌드 한 후 VTK C++ Tutorial을 하나하나씩 해보기로 하였다. 그 첫번째로 Hello World 이다.
Tutorial에서는 C++ 코드와 CMake를 이용한 빌드를 소개하고 있다. 이를 이전에 빌드한 vtkGUISupportMFC 를 이용하여 대화상자에 출력하도록 해 보았다.



m_pvtkMFCWindow = new vtkMFCWindow(this);
m_pvtkMFCWindow->GetRenderWindow()->AddRenderer(m_pvtkRenderer);
m_pvtkRenderer->SetBackground(0.0, 0.0, 0.5);


// This creates a polygonal cylinder model with eight circumferential facets.
//
m_pCylinder = vtkCylinderSource::New();
m_pCylinder->SetResolution(8);

// The mapper is responsible for pushing the geometry into the graphics
// library. It may also do color mapping, if scalars or other attributes
// are defined.
//
m_pCylinderMapper = vtkPolyDataMapper::New();
m_pCylinderMapper->SetInputConnection(m_pCylinder->GetOutputPort());

// The actor is a grouping mechanism: besides the geometry (mapper), it
// also has a property, transformation matrix, and/or texture map.
// Here we set its color and rotate it -22.5 degrees.
m_pCylinderActor = vtkActor::New();
m_pCylinderActor->SetMapper(m_pCylinderMapper);
m_pCylinderActor->GetProperty()->SetColor(1.0000, 0.3882, 0.2784);
m_pCylinderActor->RotateX(30.0);
m_pCylinderActor->RotateY(-45.0);

// Render on MFCWindow
// Add the actors to the renderer, set the background and size
//
m_pvtkRenderer->AddActor(m_pCylinderActor);
m_pvtkRenderer->SetBackground(0.1, 0.2, 0.4);

// We'll zoom in a little by accessing the camera and invoking a "Zoom"
// method on it.
m_pvtkRenderer->ResetCamera();
m_pvtkRenderer->GetActiveCamera()->Zoom(1.5);



Original Post : http://neodreamer-dev.tistory.com/745

2015/05/23

CListCtrl 에서 Check 상태 변화 확인 하기

CListCtrl에서 Check Box를 보이게 한 후 상태 변화를 확인하기 위해 LVN_ITEMCHANGED 의 메시지 핸들러의 파라메터를 확인해 보니 Item의 Uncheck와 check 가 각각 4096(0x1000) 과 8192(0x2000) 값으로 전달 되었다.


void CDlgTestDlg::OnLvnItemchangedList2(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);

if(pNMLV->uChanged & LVIF_STATE)
{
if( (pNMLV->uOldState & 0x1000) && (pNMLV->uNewState & 0x2000) )
{
TRACE("Checked Item : %d\n", pNMLV->iItem);
}
else if( (pNMLV->uOldState & 0x2000) && (pNMLV->uNewState & 0x1000) )
{
TRACE("Unchecked Item : %d\n", pNMLV->iItem);
}
}

*pResult = 0;
}


Original Post : http://neodreamer-dev.tistory.com/744

2015/05/21

Windows Shell Commands

윈도우즈는 Windows + R 키를 눌러 나오는 명령창에서 입력을 하면 특정 경로의 바로 탐색이 가능한 Shell Commands를 제공 한다.


출처:http://www.eightforums.com/tutorials/6050-shell-commands-windows-8-a.html


붉은색 명령은 windows 8에서 추가된 명령 이다.










































































































































































































































































































































Shell CommandPath of Folder it Opens
shell:AccountPictures%AppData%\Microsoft\Windows\AccountPictures
shell:AddNewProgramsFolderControl Panel\All Control Panel Items\Get Programs
shell:Administrative ToolsC:\Users\(user-name)\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Administrative Tools
shell:AppDataC:\Users\(user-name)\AppData\Roaming
shell:AppsFolderApplications
shell:Application ShortcutsC:\Users\(user-name)\AppData\Local\Microsoft\Windows\Application Shortcuts
shell:AppUpdatesFolderInstalled Updates
shell:CacheC:\Users\(user-name)\AppData\Local\Microsoft\Windows\Temporary Internet Files
shell:Camera Roll (8.1 only)C:\Users\(user-name)\Pictures\Camera Roll
shell:CD BurningC:\Users\(user-name)\AppData\Local\Microsoft\Windows\Burn\Burn
shell:ChangeRemoveProgramsFolderControl Panel\All Control Panel Items\Programs and Features
shell:Common Administrative ToolsC:\ProgramData\Microsoft\Windows\Start Menu\Programs\Administrative Tools
shell:Common AppDataC:\ProgramData
shell:Common DesktopC:\Users\Public\Desktop
shell:Common DocumentsC:\Users\Public\Documents
shell:CommonDownloadsC:\Users\Public\Downloads
shell:CommonMusicC:\Users\Public\Music
shell:CommonPicturesC:\Users\Public\Pictures
shell:Common ProgramsC:\ProgramData\Microsoft\Windows\Start Menu\Programs
shell:CommonRingtonesC:\ProgramData\Microsoft\Windows\Ringtones
shell:Common Start MenuC:\ProgramData\Microsoft\Windows\Start Menu
shell:Common StartupC:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
shell:Common TemplatesC:\ProgramData\Microsoft\Windows\Templates
shell:CommonVideoC:\Users\Public\Videos
shell:ConflictFolderControl Panel\All Control Panel Items\Sync Center\Conflicts
shell:ConnectionsFolderControl Panel\All Control Panel Items\Network Connections
shell:ContactsC:\Users\(user-name)\Contacts
shell:ControlPanelFolderControl Panel\All Control Panel Items
shell:CookiesC:\Users\(user-name)\AppData\Local\Microsoft\Windows\INetCookies
shell:Cookies\LowC:\Users\(user-name)\AppData\Local\Microsoft\Windows\INetCookies\Low
shell:CredentialManagerC:\Users\(user-name)\AppData\Roaming\Microsoft\Credentials
shell:CryptoKeysC:\Users\(user-name)\AppData\Roaming\Microsoft\Crypto
shell:desktopYour desktop folder
shell:device Metadata StoreC:\ProgramData\Microsoft\Windows\DeviceMetadataStore
shell:documentsLibraryLibraries\Documents
shell:downloadsC:\Users\(user-name)\Downloads
shell:dpapiKeysC:\Users\(user-name)\AppData\Roaming\Microsoft\Protect
shell:FavoritesC:\Users\(user-name)\Favorites
shell:FontsC:\Windows\Fonts
shell:GadgetsC:\Users\(user-name)\AppData\Local\Microsoft\Windows Sidebar\Gadgets
shell:GamesGames
shell:GameTasksC:\Users\(user-name)\AppData\Local\Microsoft\Windows\GameExplorer
shell:HistoryC:\Users\(user-name)\AppData\Local\Microsoft\Windows\History
shell:HomeGroupCurrentUserFolderHomegroup folder of current user
shell:HomeGroupFolderHomegroup
shell:ImplicitAppShortcutsC:\Users\(user-name)\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\ImplicitAppShortcuts
shell:InternetFolderInternet Explorer
shell:LibrariesLibraries
shell:LinksC:\Users\(user-name)\Links
shell:Local AppDataC:\Users\(user-name)\AppData\Local
shell:LocalAppDataLowC:\Users\(user-name)\AppData\LocalLow
shell:MusicLibraryLibraries\Music
shell:MyComputerFolderComputer (Windows 8) or This PC (Windows 8.1)
shell:My MusicC:\Users\(user-name)\Music
shell:My PicturesC:\Users\(user-name)\Pictures
shell:My VideoC:\Users\(user-name)\Videos
shell:NetHoodC:\Users\(user-name)\AppData\Roaming\Microsoft\Windows\Network Shortcuts
shell:NetworkPlacesFolderNetwork
shell:PersonalC:\Users\(user-name)\Documents
shell:PicturesLibraryLibraries\Pictures
shell:PrintersFolderAll Control Panel Items\Printers
shell:PrintHoodC:\Users\(user-name)\AppData\Roaming\Microsoft\Windows\Printer Shortcuts
shell:ProfileC:\Users\(user-name)
shell:ProgramFilesC:\Program Files
shell:ProgramFilesCommonC:\Program Files\Common Files
shell:ProgramFilesCommonX64C:\Program Files\Common Files (64-bit Windows only)
shell:ProgramFilesCommonX86C:\Program Files (x86)\Common Files (64-bit Windows only)
shell:ProgramFilesX86C:\Program Files (x86) (64-bit Windows only)
shell:ProgramFilesX64C:\Program Files (64-bit Windows only)
shell:ProgramsC:\Users\(user-name)\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
shell:PublicC:\Public
shell:PublicAccountPicturesC:\Users\Public\AccountPictures
shell:PublicGameTasksC:\ProgramData\Microsoft\Windows\GameExplorer
shell:PublicLibrariesC:\Users\Public\Libraries
shell:Quick LaunchC:\Users\(user-name)\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch
shell:RecentC:\Users\(user-name)\AppData\Roaming\Microsoft\Windows\Recent
shell:RecordedTVLibraryLibraries\Recorded TV
shell:RecycleBinFolderRecycle Bin
shell:ResourceDirC:\Windows\Resources
shell:RingtonesC:\ProgramData\Microsoft\Windows\Ringtones
shell:Roamed Tile ImagesC:\Users\(user-name)\AppData\Local\Microsoft\Windows\RoamedTileImages
shell:Roaming TilesC:\Users\(user-name)\AppData\Local\Microsoft\Windows\RoamingTiles
shell:SavedGamesC:\Users\(user-name)\Saved Games
shell:Screenshots (8.1 only)C:\Users\(user-name)\Pictures\Screenshots
shell:SearchesC:\Users\(user-name)\Searches
shell:SearchHomeFoldersearch-ms:
shell:SendToC:\Users\(user-name)\AppData\Roaming\Microsoft\Windows\SendTo
shell:SkyDrive (8.1 only)SkyDrive shell folder
shell:SkyDriveCameraRoll (8.1 only)C:\Users\(user-name)\SkyDrive\Pictures\Camera Roll
shell:SkyDriveDocuments (8.1 only)C:\Users\(user-name)\SkyDrive\Documents
shell:SkyDrivePictures (8.1 only)C:\Users\(user-name)\SkyDrive\Pictures
shell:Start MenuC:\Users\(user-name)\AppData\Roaming\Microsoft\Windows\Start Menu
shell:StartupC:\Users\(user-name)\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
shell:SyncCenterFolderControl Panel\All Control Panel Items\Sync Center
shell:SyncResultsFolderControl Panel\All Control Panel Items\Sync Center\Sync Results
shell:SyncSetupFolderControl Panel\All Control Panel Items\Sync Center\Sync Setup
shell:SystemC:\Windows\System32
shell:SystemX86C:\Windows\SysWOW64
shell:SystemCertificatesC:\Users\(user-name)\AppData\Roaming\Microsoft\SystemCertificates
shell:TemplatesC:\Users\(user-name)\AppData\Roaming\Microsoft\Windows\Templates
shell:ThisPCDesktopFolder (8.1 only)Desktop
shell:User PinnedC:\Users\(user-name)\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned
shell:UserProfilesC:\Users
shell:UsersFilesFolderC:\Users\(user-name)
shell:UsersFilesFolder\DesktopC:\Users\(user-name)\Desktop
shell:UsersLibrariesFolderLibraries
shell:VideosLibraryLibraries\Videos
shell:WindowsC:\Windows


Original Post : http://neodreamer-dev.tistory.com/743

Windows 10 업데이트 후 vcomp110d.dll 못 찾는 문제

Windows 10 Preview 버전을 사용하고 있는데 10074 버전에서 10122로 업데이트를 한 후 Visual C++ 프로젝트를 실행하면 vcomp110d.dll 파일을 찾을 수 없다는 에러메시지를 뿜어 댔다.


재배포 패키지를 설치해 봐도 해결이 되지 않았다.
인터넷을 검색하여 "Vcomp110.dll이(가) 없습니다 / 찾을 수 없음 오류 메시지 해결 방법"의 몇가지를 따라해 봤지만 소용이 없었다. 


실제로 파일을 없는지 찾아 보던 중 Windows.old 폴더를 발견했다. 아마도 10074 버전에서 사용하던 파일들로 유추가 되었고 그 곳에는 vcomp110d.dll이 존재하였다. 그래서 두 파일(vcomp110.dll, vcomp110d.dll)을 windows\system32 폴더로 복사하였다.
C:\>copy c:\Windows.old\Windows\System32\vcomp110.dll c:\Windows\System32
        1 file(s) copied.


C:\>copy c:\Windows.old\Windows\System32\vcomp110d.dll c:\Windows\System32
        1 file(s) copied.


이후 문제가 해결 됨

Original Post : http://neodreamer-dev.tistory.com/742

2015/05/16

MFC Unicode project 에서 vtkMFCWindow 생성 문제

2015/03/31 - [Dev Story/Tips] - VTK 6.2 빌드하기


이전 글에서 설명한대로 생성한 라이브러리를 테스트 해 보았다.
예제 코드를 복사하여 실행해 보았는데 컴파일에는 문제가 없었는데 실행시 vtkMFCWindow 생성하는 부분에서 아래와 같은 에러가 발생하였다.



쉽게 해결 방법을 찾지 못하다 구글 검색을 통해 해결 방법을 알게 되었다. 비슷한 문제로 고생을 한 개발자가 있었다. 해결 방법은 프로젝트의 문자셋을 멀티바이트로 변경하면 문제가 없다는 것이였다. 하여 프로젝트의 문자셋을 유니코드에서 멀티바이트로 변경하니 실행에 문제가 없었다.


이제 유니코드가 대세임을 감안하면 다른 해결 책을 찾아야 했다. 그래서 VTK 라이브러리중 vtkGUISupportMFC 를 유니코드로 변경하여 라이버리를 만들어 사용하니 사용하는 프로젝트가 유니코드이어도 정상적으로 동작을 하였다

Original Post : http://neodreamer-dev.tistory.com/741

2015/05/07

Hello OpenCV Viz

이전 포스팅을 통해 생성했던 OpenCV 의 3D Visualization module 을 테스트 해 보았다.
2015/05/07 - [Dev Story/Tips] - OpenCV viz 빌드하기



필요한 것으로는 VTK 헤더파일과 VTK와 함께 빌드후 생성 된 lib 파일과 dll 파일 그리고 OpenCV 헤더파일이 필요하다. OpenCV 를 빌드할 때 INSTALL 프로젝트를 빌드했다면 install 경로에 모든 헤더파일이 있지만 그렇지 않다면 module\viz\include 폴더에 있는 viz 관련 헤더가 필요하다.


아직은 Viz에 대한 자세한 사항을 몰라 sample과 reference 문서를 보고 간단하게 테스트 코드를 만들어 보았다.
아래 코드는 테스트를 위해 사용된 코드이다.

// Header
// OpenCV
#include "opencv2/opencv.hpp"
#include "opencv2/viz.hpp"
#include "opencv2/viz/widget_accessor.hpp""

#include "vtkPoints.h"
#include "vtkTriangle.h"
#include "vtkCellArray.h"
#include "vtkPolyData.h"
#include "vtkPolyDataMapper.h"
#include "vtkIdList.h"
#include "vtkActor.h"
#include "vtkProp.h"

#pragma comment(lib, "../OpenCV_VTK_VS2013/x86/lib/Release/opencv_core300.lib")
#pragma comment(lib, "../OpenCV_VTK_VS2013/x86/lib/Release/opencv_imgproc300.lib")
#pragma comment(lib, "../OpenCV_VTK_VS2013/x86/lib/Release/opencv_highgui300.lib")
#pragma comment(lib, "../OpenCV_VTK_VS2013/x86/lib/Release/opencv_viz300.lib")

// Source
/// Create a window
cv::viz::Viz3d vizHello("Hello Viz");

vizHello.setWindowSize(cv::Size(600, 480));

// Coordinate
vizHello.showWidget("Coordinate", cv::viz::WCoordinateSystem(1));

// Text 3D
cv::viz::WText3D wdg3DText("Hello OpenCV Viz Text3D"
, cv::Point3d(0.5, 0.5, 0.5), 0.2
, false, cv::viz::Color::green());
vizHello.showWidget("Text 3D", wdg3DText);

// Text 2D
cv::Size szWnd = vizHello.getWindowSize();
cv::viz::WText wdg2DText("Hello OpenCV Viz Text2D"
, cv::Point(szWnd.width / 4, szWnd.height / 4)
, 20, cv::viz::Color::yellow());
vizHello.showWidget("Text 2D", wdg2DText);
vizHello.spin();



아래 이미지는 위의 코드를 실행하면 보여지는 화면 이다.



프로그램이 정상적으로 실행되는 것으로 볼 때 OpenCV에 VTK 라이브러리를 포함 한 빌드에는 문제가 없어 보인다. 화면 출력은 3D는 자체 좌표계로 운영되고 마우스 컨트롤로 변경할 수 있으며 2D는 화면의 좌 하단을 원점으로 출력 된다.


Viz 운영에 있어 중요한 객체는 두 가진 인데 그려지는 윈도우를 담당하는 Viz3D 와 그려지는 내용을 담당하는 Widget 이다. Viz3D의 경우 Widget을 화면에 출력해 주는 역할을 한다

Original Post : http://neodreamer-dev.tistory.com/740

OpenCV viz 빌드하기



OpenCV 2.4.9 버전부터 지원한 3D visualization module 인 viz를 사용해보고자 빌드를 해 보았다.




빌드를하기 위해서는 VTK(Visual Tool Kit)이 필요하다. 3D visualization module 이 VTK를 기반으로 만들어졌기 때문이다.


우선 VTK site(http://www.vtk.org/)에서 소스를 받아 아래 설명에따라 빌드를 한다.
2015/03/31 - [Dev Story/Tips] - VTK 6.2 빌드하기


VTK 빌드를 마친 후 OpenCV를 빌드하여야 한다. 이 때 VTK 를 사용할 수 있도록 설정을 해 주어야 한다.

  • WITH_VTK 선택
  • VTK_DIR 항목에 위에서 빌드한 VTK 경로를 설정. 이 때 install 경로가 아닌 cmake설정에 쓰인 Where to build binaries 경로를 입력 한다.
  • BUILD_opencv_viz 항목 선택
  • BUILD_opencv_world 항목은 선택하지 않는다. (빌드시 에러가 발생하며 원인과 해결책은 찾지 못하였음)
그 외에 자세한 OpenCV 빌드 방법은 아래 글을 참고 하면 된다.
2010/04/07 - [Dev Story] - OpenCV 2.1 컴파일 하기
2010/10/17 - [Dev Story] - OpenCV 2.1 + TBB 를 Visual Studio 2010 에서 컴파일하기
2011/01/18 - [Dev Story/Tips] - OpenCV 2.2 + Intel TBB 를 VS2010 에서 컴파일하기(32/64비트 분리)



OpenCV 를 빌드할 때 INSTALL project를 빌드하면 viz 모듈에 포함되어 있는 소스파일이 install 경로의 include 폴더에 복사가 되지만 ALL_BUILD 만 빌드하면 수동으로 viz 모듈의 헤더파일을 복사해야 한다.


위 작업을 Visual Studio 2013 버전으로 OpenCV 3.0 RC1 과 VTK 6.2.0을 이용하여 진행하였으며 VTK는 Static으로 빌드하였다. 


이 과정에서 별다른 문제가 발생하지 않고 결과물이 생성 되었다. 일단 빌드는 성공하였고 이를 사용하는 것은 앞으로 조금씩 공부를 하며 진행할 예정이다.
Original Post : http://neodreamer-dev.tistory.com/739