1

ビデオストリームをレンダリングするためにopenFrameworksを使用しています。OpenFrameworks はofImage、イメージをofPixel(ベクトルを格納するunsigned char) のベクトルとして格納するクラスを使用します。

各フレームを取得するために C# .NET dll を使用しています。このライブラリはBitmap、取得したフレームを返すために使用します。これまでのところ、C# .NET がCommon Language Runtimeの下で動作することはわかっています。

私の質問は、ネイティブ C++ コードとマネージ C# を通信するために、どの .NET ツールまたは機能を使用できるかということです。

4

1 に答える 1

4

画像を取得するために、このチュートリアルを使用しました。アンマネージ コードから C# マネージ ライブラリを使用する方法を徹底的に説明します。

私が従ったプロセスはここに文書化されています。

概要はこちら

  • C++/CLI プロジェクトを作成します (Visual Studio の [新しいプロジェクト] ダイアログの CLR クラス ライブラリ)。
  • C# dll への参照を追加する 必要な C# dll 機能をネイティブ世界に公開するネイティブ クラスおよび/または関数を作成する。
  • 通常の手段 (__declspec(dllexport) または .def ファイル) を使用してそれらをエクスポートします。
  • C++/CLI プロジェクトによって生成された .lib を、ネイティブ プロジェクトのリンカー入力として追加します。

画像情報については、バイト配列と呼ぶことができます。GCHandle を使用してマネージド コードに固定する必要があります。この概念を説明するコードを次に示します (免責事項、この回答は、元の msdn フォーラムの投稿で別の作成者によって提供されました)。

#include <unordered_map>

using namespace System;
using namespace System::Runtime::InteropServices;

std::unordered_map<void *, void *> dataHandles;

void *getData() {
    array<Byte>^ arr = gcnew array<Byte>(2);
    arr[0] = 'C';
    arr[1] = '#';

    GCHandle handle = GCHandle::Alloc(arr, GCHandleType::Pinned);
    void *data = (void *)handle.AddrOfPinnedObject();
    dataHandles.insert(std::make_pair(data, (void *)GCHandle::ToIntPtr(handle)));
    return data;
}

void releaseData(void *data) {
    auto i = dataHandles.find(data);

    if (i != dataHandles.end())
        GCHandle::FromIntPtr((IntPtr)i->second).Free();
}

#pragma unmanaged

void native() {
    char *data = (char *)getData();

    for (int i = 0; i < 2; i++)
        printf("%c ", data[i]);

    releaseData(data);
}

#pragma managed

int main(array<System::String ^> ^args) {
    native();
    return 0;
}

コンバージョンに特化Bitmapした詳細はこちらunsigned char *

于 2013-10-03T21:37:33.097 に答える