2017年2月19日 星期日

Start Kinect for Windows v2 in C++

since: 2017/02/18
update: 2017/02/19
reference:
1. Kinect for Windows SDK v2 基本介紹 | Heresy's Space
2. Kinect for Windows SDK v2 C++ API 簡介 | Heresy's Space
3. K4W v2 C++ Part 1:簡單的深度讀取方法 | Heresy's Space

4. Kinect with Visual Studio 2015 and Windows 10

A. 系統需求:
     1. A Kinect for Windows v2 Device (K4W2)
     2. 64bit computer with a dedicated USB 3.0
     3. Windows 10, 8, 8.1 (64bit)
     4. Update your latest video card driver
     5. Install DirectX 11

     6. Visual Studio Community 2012, 2013, 2015

     備註:
      a. How to Check Direct X Version in Windows:
      (1). Click “Start” > Run” or hold down the “Windows Key” and press “R“.
      (2). Type “dxdiag“, then click “OK“.
      (3). The version of DirectX you are currently running will be displayed
             on your screen.

       b.  check your system: run the Kinect Configuration Verifier tool


-----------------------------------------------------------------------------------------------

B. 安裝 Kinect for Windows SDK 2.0

    1. 下載 Kinect for Windows SDK 2.0

    2. 解壓縮後, 開始安裝

    3. 預設安裝路徑為: C:\Program Files\Microsoft SDKs\Kinect\v2.0_1409

    4. 可以檢查環境變數, 已自動新增一個系統變數:
        變數: KINECTSDK20_DIR
        : C:\Program Files\Microsoft SDKs\Kinect\v2.0_1409\

    5. 接著, 將 Kinect 插上電源並連接到電腦, 從裝置管理員可以看到相關的裝置.

    6. 工作管理員也可以看到相關的背景程式正在執行

    7. Windows 10 亦可檢查:
        >  設定

      > 裝置

       > 連線的裝置

    8. 測試: 開啟 SDKBrowser

    9. 注意: 不需要再執行 "Kinect Configuration Verifier" 了, 可能會造成之後的程式
        無法正常執行. (如果有發生的話, 請移除Kinect for Windows SDK 2.0, 再重裝一次)


  10. 執行 "Samples: C++" 分類的 Depth Basics-D2D

   > 結果:

-----------------------------------------------------------------------------------------------

C. Visual Studio 專案設定(在此以 Visual Studio 2015 為例)
     1. 新增專案:
         a. 檔案 > 新增 > 專案

         b. Visual C++ > Win32 主控台應用程式 > 確定

         c.下一步 > 勾選: 空專案 > 完成

         d. 結果

     2. 新增主程式:
         a. 專案 > 加入 > 新增項目

         b. Visual C++ > C++ 檔(.cpp) > 名稱: DepthReader.cpp > 新增

     3. 專案屬性設定
         a. 專案 > 屬性

         b. C/C++ > 一般 > 其他 Include 目錄: 加入 $(KINECTSDK20_DIR)\inc

         c. 連結器 > 一般 > 其他程式庫目錄: 加入 $(KINECTSDK20_DIR)\Lib\x64

         d. 連結器 > 輸入 > 其他相依性: 加入 kinect20.lib

-----------------------------------------------------------------------------------------------

D. 深度讀取
     1. 程式碼: DepthReader.cpp
// Standard Library
#include <iostream>

// Kinect for Windows SDK Header
#include <Kinect.h>

int main(int argc, char** argv)
{
    // 1a. Get default Sensor
    IKinectSensor* pSensor = nullptr;
    GetDefaultKinectSensor(&pSensor);

    // 1b. Open sensor
    pSensor->Open();

    // 2a. Get frame source
    IDepthFrameSource* pFrameSource = nullptr;
    pSensor->get_DepthFrameSource(&pFrameSource);

    // 3a. get frame reader
    IDepthFrameReader* pFrameReader = nullptr;
    pFrameSource->OpenReader(&pFrameReader);

    //@add: show Title ############
    std::cout << "\n" << "Depth Reader: " << "\n" << std::endl;

    // Enter main loop
    size_t uFrameCount = 0;
    while (uFrameCount < 3)
    {
        // 4a. Get last frame
        IDepthFrame* pFrame = nullptr;

        if (pFrameReader->AcquireLatestFrame(&pFrame) == S_OK)
        {
            // 4b. Get frame description
            int        iWidth = 0;
            int        iHeight = 0;
            IFrameDescription* pFrameDescription = nullptr;
            pFrame->get_FrameDescription(&pFrameDescription);
            pFrameDescription->get_Width(&iWidth);
            pFrameDescription->get_Height(&iHeight);
            pFrameDescription->Release();
            pFrameDescription = nullptr;
           
            //@add: show iWidth & iHeight ############
            std::cout << "iWidth = " << iWidth << std::endl;
            std::cout << "iHeight = " << iHeight << std::endl;

            // 4c. Get image buffer
            UINT    uBufferSize = 0;
            UINT16*    pBuffer = nullptr;
            pFrame->AccessUnderlyingBuffer(&uBufferSize, &pBuffer);

            // 4d. Output depth value
            int x = iWidth / 2,
                y = iHeight / 2;
            size_t idx = x + iWidth * y;

            //@add: show x, y, idx & uBufferSize ############
            std::cout << "x = " << x << std::endl;
            std::cout << "y = " << y << std::endl;
            std::cout << "idx = " << idx << std::endl;
            std::cout << "uBufferSize = " << uBufferSize << std::endl;

            std::cout << "pBuffer[idx] = " << pBuffer[idx] << std::endl;
            std::cout << "------------------------------------------------" << std::endl;
           
            // 4e. release frame
            pFrame->Release();
            pFrame = nullptr;

            ++uFrameCount;
        }

        //@add: sleep ############
        Sleep(10); // 0.01 second
    }

    // 3b. release frame reader
    pFrameReader->Release();
    pFrameReader = nullptr;

    // 2b. release Frame source
    pFrameSource->Release();
    pFrameSource = nullptr;

    // 1c. Close Sensor
    pSensor->Close();

    // 1d. Release Sensor
    pSensor->Release();
    pSensor = nullptr;

    //@add: pause ############
    //
    // Gill Bates:
    // system("pause"); it isn't cross platform.
    // Use getchar(); to pause program execution.

    printf("Press ENTER key to Continue\n");
    getchar();

    return 0;
}


    2. 執行:
         > 選擇 x64 模式

         > 建置 > 建置方案


         > 結果

2017年2月1日 星期三

How to Fix: Launch an older app crashes immediately on Mac

since: 2017/02/01
update: 2017/02/01

reference:
1. macos - "This UPX compressed binary contains an invalid Mach-O header and cannot be loaded." - Ask Different
2. Install upx on Mac OSX – Mac App Store


A. Error Message:
     “This UPX compressed binary contains an invalid Mach-O header and cannot be loaded.”
    
-----------------------------------------------------------------------------------------------

B. Install ups on Mac
    1. Install Homebrew:
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null

    2. Install upx: (目前版本: 3.93)
$ brew install upx

-----------------------------------------------------------------------------------------------

C. 檢查 app 套件執行位置:
     > yourApp.app > 顯示套件內容 > Contents > MacOS > x-force
        (不同 app 會有不同檔名)


-----------------------------------------------------------------------------------------------

D. Decompressing the app's binary using the -d option

     $ upx -d yourApp.app/Contents/MacOS/x-force

     (完成)

-----------------------------------------------------------------------------------------------

D. 備註:
     1. 讓 Mac Sierra 可以安裝第三方軟體
         a. 啟用功能: (開啟允許「任何來源」選項)
             終端機程式 > sudo spctl --master-disable

         b. 停用功能: (關閉「任何來源」選項)
             終端機程式 > sudo spctl --master-enable