2

Windows Phone8およびWindows8で利用可能なOpenCVグラフィックライブラリのサポートはありますか?Googleで検索しましたが、Windows Phone 8 /Windows8に接続するためのOpenCVに関連するリソースが見つかりませんでした。これについて私を助けてください、そして図書館に到達するためのいくつかのリンクを提供してください。

4

3 に答える 3

4

これは、OpenCV チームから得た最新情報です。

OpenCV 開発チームは、Windows RT への移植に取り組んでいます。WinRT の現在の開発ブランチ ( https://github.com/asmorkalov/opencv/tree/winrt ) は次のとおりです。Visual Studio Express for Windows 8 および Platform SDK を使用して ARM 用にビルドできます。

      Open Visual Studio development console.
      Setup environment for cross compilation by command "C:\Program Files(x86)\Microsoft
      Visual Studio 11.0\VC\bin\x86_arm\vcvarsx86_arm.bat"
      cd <opencv_source_dir>/platforms/winrt/
      run scripts/cmake_winrt.cmd
      run ninja

あるいは、ninja の代わりに nmake を使用することもできます。cmake_winrt.cmd を編集し、プロジェクト ジェネレーターを -GNinja から -G "NMake Makefiles" に変更する必要があります。現在、ライブラリのアルゴリズム部分のみがサポートされており、tbb、UI、ビデオ IO はサポートされていません。

詳しくは下記URLよりご確認ください。 http://answers.opencv.org/question/9847/opencv-for-windows-8-tablet/?answer=9851#post-id-9851

于 2013-03-22T06:28:15.493 に答える
3

Windows-8とは、winRTのことですか?AFAIK、winRTへの公式ポートはありません。たとえば、Win8ストアアプリケーションから参照できるように、Win8ストアDLLとして自分でコンパイルする必要があります。

opencv-coreから始めて、必要なライブラリを1つずつ追加します。これは、すべてのコンポーネントをコンパイルできないためです(たとえば、opencv-highguiは、Win8ストアアプリと完全に互換性のないWindowsAPIに大きく依存しています。 )。

また、OpenCVで使用され、GetSystemInfo()、GetTempPathA()、GetTempFileNameA()、スレッドローカルストレージ(TLS)に関連するすべてのメソッドなど、Win8アプリからアクセスできないいくつかのWin32メソッドを自分でコーディングする必要があります。

opencv_core、opencv_imgproc、zlibを3つの個別の静的ライブラリとしてコンパイルすることで、WinRTでOpenCVの小さなサブセットを使用することができました。opencv_winrtと呼ばれる、次の2つのファイルのみを含む相互に追加しました。

opencv_winrt.h

#pragma once

#include "combaseapi.h"

void WINAPI GetSystemInfo(
    _Out_  LPSYSTEM_INFO lpSystemInfo
);

DWORD WINAPI GetTempPathA(
  _In_   DWORD nBufferLength,
  _Out_  char* lpBuffer
);
UINT WINAPI GetTempFileNameA(
  _In_   const char* lpPathName,
  _In_   const char* lpPrefixString,
  _In_   UINT uUnique,
  _Out_  char* lpTempFileName
);

DWORD WINAPI TlsAlloc();
BOOL WINAPI TlsFree(
    _In_ DWORD dwTlsIndex
);
LPVOID WINAPI TlsGetValue(
    _In_ DWORD dwTlsIndex
);
BOOL WINAPI TlsSetValue(
    _In_ DWORD dwTlsIndex, 
    _In_opt_ LPVOID lpTlsValue
);

void WINAPI TlsShutdown();

# define TLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF)

opencv_winrt.cpp

#include "opencv_winrt.h"
#include <vector>
#include <set>
#include <mutex>
#include "assert.h"


void WINAPI GetSystemInfo(LPSYSTEM_INFO lpSystemInfo)
{
    GetNativeSystemInfo(lpSystemInfo);
}

DWORD WINAPI GetTempPathA(DWORD nBufferLength, char* lpBuffer)
{
    return 0;
}

UINT WINAPI GetTempFileNameA(const char* lpPathName, const char* lpPrefixString, UINT uUnique, char* lpTempFileName)
{
    return 0;
}


// Thread local storage.
typedef std::vector<void*> ThreadLocalData;

static __declspec(thread) ThreadLocalData* currentThreadData = nullptr;
static std::set<ThreadLocalData*> allThreadData;
static DWORD nextTlsIndex = 0;
static std::vector<DWORD> freeTlsIndices;
static std::mutex tlsAllocationLock;

DWORD WINAPI TlsAlloc()
{
    std::lock_guard<std::mutex> lock(tlsAllocationLock);

    // Can we reuse a previously freed TLS slot?
    if (!freeTlsIndices.empty())
    {
        DWORD result = freeTlsIndices.back();
        freeTlsIndices.pop_back();
        return result;
    }

    // Allocate a new TLS slot.
    return nextTlsIndex++;
}


_Use_decl_annotations_ BOOL WINAPI TlsFree(DWORD dwTlsIndex)
{
    std::lock_guard<std::mutex> lock(tlsAllocationLock);

    assert(dwTlsIndex < nextTlsIndex);
    assert(find(freeTlsIndices.begin(), freeTlsIndices.end(), dwTlsIndex) == freeTlsIndices.end());

    // Store this slot for reuse by TlsAlloc.
    try
    {
        freeTlsIndices.push_back(dwTlsIndex);
    }
    catch (...)
    {
        return false;
    }

    // Zero the value for all threads that might be using this now freed slot.
    for each (auto threadData in allThreadData)
    {
        if (threadData->size() > dwTlsIndex)
        {
            threadData->at(dwTlsIndex) = nullptr;
        }
    }

    return true;
}


_Use_decl_annotations_ LPVOID WINAPI TlsGetValue(DWORD dwTlsIndex)
{
    ThreadLocalData* threadData = currentThreadData;

    if (threadData && threadData->size() > dwTlsIndex)
    {
        // Return the value of an allocated TLS slot.
        return threadData->at(dwTlsIndex);
    }
    else
    {
        // Default value for unallocated slots.
        return nullptr;
    }
}


_Use_decl_annotations_ BOOL WINAPI TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue)
{
    ThreadLocalData* threadData = currentThreadData;

    if (!threadData)
    {
        // First time allocation of TLS data for this thread.
        try
        {
            threadData = new ThreadLocalData(dwTlsIndex + 1, nullptr);

            std::lock_guard<std::mutex> lock(tlsAllocationLock);

            allThreadData.insert(threadData);

            currentThreadData = threadData;
        }
        catch (...)
        {
            if (threadData)
                delete threadData;

            return false;
        }
    }
    else if (threadData->size() <= dwTlsIndex)
    {
        // This thread already has a TLS data block, but it must be expanded to fit the specified slot.
        try
        {
            std::lock_guard<std::mutex> lock(tlsAllocationLock);

            threadData->resize(dwTlsIndex + 1, nullptr);
        }
        catch (...)
        {
            return false;
        }
    }

    // Store the new value for this slot.
    threadData->at(dwTlsIndex) = lpTlsValue;

    return true;
}


// Called at thread exit to clean up TLS allocations.
void WINAPI TlsShutdown()
{
    ThreadLocalData* threadData = currentThreadData;

    if (threadData)
    {
        {
            std::lock_guard<std::mutex> lock(tlsAllocationLock);

            allThreadData.erase(threadData);
        }

        currentThreadData = nullptr;

        delete threadData;
    }
}

そして、ファイルcvconfig.hを変更します。PACKAGE*とVERSIONを除くすべての#defineをコメントアウトし、最後に#include"opencv_winrt.h"を追加しました。

于 2013-02-28T10:42:11.277 に答える
2

ヒント - OpenCV 用の C# ラッパーEmguCV( http://www.emgu.com/wiki/index.php/Main_Page ) があります。フォーラムの投稿を見ると、Windows での使用に向けた動きがあることがわかります。 8 しかし、問題を主張する投稿がかなり古いため、現在機能しているかどうかを判断するのは困難です. 試してみて、この C# ラッパーが Windows Phone 8 で実行できるかどうかを確認することをお勧めします。間違いなく Windows 8 で実行する必要があると思います。

于 2013-02-28T07:32:52.893 に答える