2018/08/23

[Python] 컬러 영상의 채널 분리하기

컬러영상의 각 채널데이터를 분리할 일이 있었는데 C++로 만들어 보려다 Python 예제를 찾아 만들어보았는데 아주 간단한 코드로 원하는 결과를 얻을 수 있었다.
Python의 생산성은 정말 대단한 것 같다. Python을 좀더 공부해야겠다.
import cv2
import numpy as np
img = cv2.imread("ColorImage.png")
b,g,r = cv2.split(img)
cv2.imwrite('Image_R.png', r)
cv2.imwrite('Image_G.png', g)
cv2.imwrite('Image_B.png', b)

2018/08/21

Build OpenCV 3.4.2 with VTK 8.1.1

오래전에 OpenCV의 viz 모듈에 관심이 있어 VTK를 OpenCV 와 VTK를 빌드한 적이 있었다.
Build OpenCV 3.1 with VTK 7.0 in Visual Studio 2015

그때당시 VTK의 Renderer 설정과 world 모듈 생성에 문제가 있어서 복잡하게 했던 기억이 있다.

먼저 VTK 를 CMake를 이용하여 정적라이브러리로 빌드한다.
이전과는 다르게 Renderer 설정을 변경할 필요가 없었다. 기본 제공하는 OpenGL2로 진행을 한다.
OpenCV와 정적으로 연결되도록 BUILD_SHARED_LIBS 옵션을 해제하였다.

Srouce: E:/DevWork/VTK/VTK-8.1.1
Build:  E:/DevWork/VTK/VTK-8.1.1_VS2013_x86Static
 
Configuration options
  BUILD_EXAMPLES                   uncheck
  BUILD_SHARED_LIBS                uncheck
  BUILD_TESTING                    uncheck
  CMAKE_INSTALL_PREFIX             BuildPath/install

VTK 빌드를 완료하였다면 OpenCV를 빌드 할 차례이다.
OpenCV는 VTK 빌드 경로와 viz와 world 모듈을 빌드하도록 하였고 CXX11, OpenGL과 OpenMP를 사용하도록 설정하였다. 빠른 테스트를 위해 BUILD_TESTS 옵션을 선택하였다.

Source: E:/DevWork/OpenCV/VTK/opencv-3.4.2
Build:  E:/DevWork/OpenCV/VTK/opencv-3.4.2_VC2013_x86
 
Configuration options
  BUILD_DOCS            uncheck
  BUILD_EXAMPLES        uncheck
  BUILD_TESTS           check
  VTK_DIR               E:/DevWork/VTK/VTK-8.1.1_VS2013_x86Static
  WITH_OPENGL           check
  WITH_OPENMP           check
  
  BUILD_opencv_viz      check
  BUILD_opencv_world    check

이전에는 viz 모듈이 world모듈로 포함이되지 않아서 world 별도로 빌드하고 viz 빌드시 라이브러리 참조를 opencv_core에서 opencv_world 로 변경하였는데 이번에는 viz 모듈이 world모듈로 포함이 되었다.
따라서 빌드후 world 모듈인 opencv_world342.dll 파일만 있으면 된다.

완료후 실제 테스트를 하려면 시간이 소요될 것 같아서 OpenCV를 빌드할 때 BUILD_TESTS 옵션을 선택하여 테스트 파일이 만들어지도록 하였다.

빌드를 마친후 bin\Release 폴더의 opencv_test_viz.exe를 실행해 보았다.

문제없이 실행되는 것으로 보아 viz 모듈이 world에 제대로 포함된 것 같다.

Build Poco 1.9.0 with OpenSSL and MySQL

오랜만에 Poco 라이브러리 1.9 버전을 빌드해 보았다.
얼마전부터 계속 시도해 보았지만 OpenSSL을 포함하는데 문제가 있어서 계속 실패를 하다가 인터넷을 통해 도움을 얻어 드디어 성공하였다.
일단 Poco 라이브러리의 추가 포함 라이브러리는 목적에따라 OpenSSL과 MySQL을 추가할 수 있다.
언제든 사용할 수 있는 라이브러리라서 빌드할 때 이들을 추가해 놓으면 편할 것 같아서 항상 이를 포함하여 빌드한다.

우선 빌드에 필요한 것들은 다음과 같다.
Poco Library 1.9
https://github.com/pocoproject/poco
poco-poco-1.9.0-release.zip
OpenSSL
https://github.com/pocoproject/openssl
openssl-develop.zip
MySQL
https://dev.mysql.com/downloads/mysql/5.7.html#downloads
mysql-5.7.23-win32.zip
mysql-5.7.23-winx64.zip

OpenSSL 빌드하기
https://github.com/pocoproject/openssl 에서 받은 소스를 빌드한다.
이미 Vsiual Studio 2013 버전으로 빌드가 되어있는 dll과 라이브러리가 소스에 포함되어있어 이를 이용하는 경우 빌드를 할 필요가 없다.
혹시 OpenSSL 버전을 변경하고자 하는경우 다시 빌드를 해야한다.
2018년 08월 17일 현재 올려져있는 버전은 1.1.0g 버전이다.
새롭게 빌드를 하고자 하는경우 소스를 압축해제하고 해제한 폴더에서 다음 명령을 수행하면 된다.
build.ps1을 실행하면 된다.
build.ps1 명령을 아래와 같은 형식이고,
build.ps1 [-openssl_release 1.0.0 | 1.1.0]
          [-vs_version 150 | 140 | 120 | 110 | 100 | 90]
          [-config     release | debug | both]
          [-platform   Win32 | x64] # TODO WinCE/WCE
          [-library    shared | static | both]
       
실행 예제는 다음과 같다.       
powershell -ExecutionPolicy RemoteSigned -File build.ps1 -openssl_release 1.1.0h -vs_version 120 -config both -platform x64 -library both

빌드를 하면 소스 경로에 VC_(버전번호) 의 폴더가 만들어지고 그 안에 결과 파일들이 생성된다.

Poco 추가 라이브러리 구성하기
먼저 Poco 라이브러리 소스 파일(poco-poco-1.9.0-release.zip)을 압축해제한다.
그리고 OpenSSL을 빌드를 하지 않은경우 openssl-develop.zip 파일의 build 폴더를 Poco 소스의 openssl 폴더에 복사한다.
OpenSSL을 빌드하였다면 결과 폴더(VC_(버전번호))를 openssl 폴더에 복사하고 이름을 build로 변경한다.

Poco 소스 폴더에 mysql 폴더를 생성하고 mysql-5.7.23-win32.zip 파일의 include 와 lib 폴더를 압축해제하고 lib 폴더는 lib32로 변경한다.
그리고 mysql-5.7.23-winx64.zip 파일의 lib 폴더를 mysql 폴더에 압축해제하고 lib64로 변경한다.
그러면 최종적으로 추가 생성된 폴더는 아래와 같은 구성된다.
poco-poco-1.9.0-release
openssl
build
include
openssl
win32
bin
lib
win64
bin
lib
mysql
include
lib32
lib64

빌드를 하기전에 buildwin.cmd 파일에서 위에서 구성한 mysql 폴더를 사용하도록 변경을 해 주어야한다.
PLATFORM 파라메터를 인식한 후에 아래 코드를 추가(62line)한다.
rem MySQL
set MYSQL_DIR=%POCO_BASE%\mysql
set MYSQL_INCLUDE=%MYSQL_DIR%\include
if "%PLATFORM%"=="Win32" (set MYSQL_LIB=%MYSQL_DIR%\lib32)
if "%PLATFORM%"=="x64" (set MYSQL_LIB=%MYSQL_DIR%\lib64)
set INCLUDE=%INCLUDE%;%MYSQL_INCLUDE%
set LIB=%LIB%;%MYSQL_LIB%

echo MySQL Path: %MYSQL_DIR%
echo Include: %INCLUDE%
echo Lib: %LIB%
pause

echo 명령과 pause 명령은 mysql 관련 설정이 제대로 되었는지 확인하기 위해 넣은 코드이다.

이제 Visual Studio 버전에 맞는 빌드 명령을 호출하면 된다.
buildwin.cmd 명령 형식은 다음과 같다.
Usage:
------
buildwin VS_VERSION [ACTION] [LINKMODE] [CONFIGURATION] [PLATFORM] [SAMPLES] [TESTS] [TOOL]
VS_VERSION:    "90|100|110|120|140|150"
ACTION:        "build|rebuild|clean"
LINKMODE:      "static_mt|static_md|shared|all"
CONFIGURATION: "release|debug|both"
PLATFORM:      "Win32|x64|WinCE|WEC2013"
SAMPLES:       "samples|nosamples"
TESTS:         "tests|notests"
TOOL:          "devenv|vcexpress|wdexpress|msbuild"

아래 명령은 Visual Studio 2013 버전으로 빌드하기 위해 실행한 명령이다.
buildwin.cmd 120 build all both x64 samples tests msbuild

빠르게 빌드만 하려면 SAMPLES과 TESTS에 대하여 nosamples 와 notests로 설정하여 빌드한다.