「Unity」カテゴリーアーカイブ

UnityでAzureKinectのカラー画像表示する

ネット上にUnityで動くAzureKinectのサンプルがあんまりないんですよね・・・・
ほとんどDepthを使ってPointCloud表示したりとか

シンプルすぎるやつはまあ、誰でもできるよねって感じかもしれないけどC#なれてない自分は時間がかかったのでここに置いておきます。

UnityでAzureKinectを動かすためプロジェクトづくりはMicrosoftの公式のサンプルの中にUnityで使えるBodyTrackingのやつに書いてあるのでそれ見て環境を作ってください。
https://github.com/microsoft/Azure-Kinect-Samples

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Microsoft.Azure.Kinect.Sensor;

public class ColorImageKinect : MonoBehaviour
{
    Device device;
    Calibration calibration;
    Texture2D kinectColor;
    DeviceConfiguration config;

    [SerializeField]
    Material mat;

    // Start is called before the first frame update
    void Start()
    {
        InitKinect();
    }


    void InitKinect()
    {
        device = Device.Open(0);

        config = new DeviceConfiguration();
        config.ColorFormat = ImageFormat.ColorBGRA32;
        config.ColorResolution = ColorResolution.R720p;
        config.DepthMode = DepthMode.NFOV_2x2Binned;
        config.CameraFPS = FPS.FPS30;
        config.SynchronizedImagesOnly = true;

        device.StartCameras(config);

        calibration = device.GetCalibration();

        int width = calibration.ColorCameraCalibration.ResolutionWidth;
        int height = calibration.ColorCameraCalibration.ResolutionHeight;

        kinectColor = new Texture2D(width, height);
    }

    // Update is called once per frame
    void Update()
    {

        Capture capture = device.GetCapture();
        
        Image colorImg = capture.Color;
        Image depthImg = capture.Depth;
    
        Color32[] pixels = colorImg.GetPixels<Color32>().ToArray();

        kinectColor.SetPixels32(pixels);
        kinectColor.Apply();

        mat.mainTexture = kinectColor;

    }

    private void OnDestroy()
    {
        device.StopCameras();
    }
}

上記スクリプトを適当なゲームオブジェクトにつけて、適当なマテリアルを用意すれば動くはず。
なぜか青と赤の色が入れ替わってるけど気にする人はシェーダーで直したってくださいませ。

UnityでOpenCVのネイティブプラグインを利用してみる

凹みTipsさん(http://tips.hecomi.com/entry/2014/01/16/011727)がOpenCVを使って書いたネイティブプラグインをUnityから使っていたので僕も真似してみることにしてみました。
(基本的には凹みTipsさんと同じなので差分のところだけ)

参考程度ですが、私の開発環境はMacでUnityは4.3を利用しています。

1.OpenCVをビルドする。
MacでOpenCVを利用する場合、homebrew等でインストールするのが楽で良いです。
でも、Unityのネイティブプラグインを使う場合32bitで作らねばならず、homebrewでは32bitビルドしてもうまくいかないため、CMakeを利用してOpenCVのソースからビルドする必要があります。

CMAKE_OSX_ARCHITECTURESにi386;x86_64と値を設定してやれば32bitでも使えるようになります。
また、BUILD_SHARED_LIBSのチェックも外して、スタティックライブラリとしてビルドされるようにしました。
(凹みTipsさんはdylibでやってたのですが何故かうまく行かなかった…)

2.Bundleを作る
WindowsではDLLですが、MacではBundleを作ります。
Xcodeで新しいプロジェクトを作る時にBundleを設定すればいけると思います。

凹みTipsさんからソースをそのまま利用させてもらいました。

3.Unityに読み込む
ここは特に引っかかることなく成功。

1.のあたりで結構引っかかってうまく行かなかったのですが、じっくり差分のところを文字に起こしてみると意外とシンプルな感じになりました。

Dll Not Found Exceptionで苦しんだ時

基本的にはUnityでDLLを使うときはAsset/PluginsフォルダにDLL突っ込めばDLLは使える

参考 テラシュールウェア [Unity3D]UnityのスクリプトをDLL化する
http://terasur.blog.fc2.com/blog-entry-312.html
でもたまーにAのDLLが更にBのDLLを必要としている時があって、AのDLLは入れてるのにBのDLLが無いためにA のDLLで「Dll Not Found Exception」と出ることがある。
入ってるのに「なんでや!?」ってなる時は多分コレが原因だと思う。

 

そこでAのDLLが他のDLLに依存してるか調べるツールがあるので使ってみると非常に便利
DependencyWalker
http://www.dependencywalker.com/

これで調べるとたまーに思いがけないDLLがひっそり依存してたりするので、DLLをどっかから拾ったりして使うときにタイトルのエラーで動かない時は試してみるといいかも。