none
OpenCvSharpのAzure上での実行について RRS feed

  • 質問

  • https://social.msdn.microsoft.com/Forums/ja-JP/30a71c5f-5f46-48c0-9a09-06a2c0c8ab44/opencvsharp?forum=csharpgeneralja

    ※以下の質問内容は、上記の「C#」のスレッドで質問させて頂いた内容の続きになっております。今までの設定方法等に問題がある可能性も御座いますので、上記のスレッドにて、今までの設定履歴を確認して頂ければと思います。

    OpenCvSharpをAzure上で実行させたいと考えておりまして、次のサイトの手順にしたがってプログラムを作成した結果、ローカル上では動作を成功させることが出来ました。

    http://schima.hatenablog.com/entry/2014/01/22/203026

    次にMicrosoft Azureへの配置を行ってみた結果、次のようなエラーメッセージが表示されました。

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

    Server Error in '/' Application.

    Runtime Error

    Description: An application error occurred on the server. The current custom error settings for this application prevent the details of the application error from being viewed remotely (for security reasons). It could, however, be viewed by browsers running on the local server machine. 

    Details: To enable the details of this specific error message to be viewable on remote machines, please create a <customErrors> tag within a "web.config" configuration file located in the root directory of the current web application. This <customErrors> tag should then have its "mode" attribute set to "Off".
    <!-- Web.Config Configuration File -->
    
    <configuration>
        <system.web>
            <customErrors mode="Off"/>
        </system.web>
    </configuration>

    Notes: The current error page you are seeing can be replaced by a custom error page by modifying the "defaultRedirect" attribute of the application's <customErrors> configuration tag to point to a custom error page URL.
    <!-- Web.Config Configuration File -->
    
    <configuration>
        <system.web>
            <customErrors mode="RemoteOnly" defaultRedirect="mycustompage.htm"/>
        </system.web>
    </configuration>

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

    このエラー内容に従いまして、Web.Configに<customErrors mode="Off"/>を書き込んでから、再度Microsoft Azureへの配置を行ってみた結果、次のようなエラーメッセージが表示されました。

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

    Server Error in '/' Application.

    Unable to load DLL 'opencv_core2410': The specified module could not be found. (Exception from HRESULT: 0x8007007E)

    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

    Exception Details: System.DllNotFoundException: Unable to load DLL 'opencv_core2410': The specified module could not be found. (Exception from HRESULT: 0x8007007E)

    Source Error:

    An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

    Stack Trace:
    [DllNotFoundException: Unable to load DLL 'opencv_core2410': The specified module could not be found. (Exception from HRESULT: 0x8007007E)]
       OpenCvSharp.NativeMethods.cvReleaseImage(IntPtr& image) +0
       OpenCvSharp.Utilities.PInvokeHelper.TryPInvoke() +31
    
    [OpenCvSharpException: Unable to load DLL 'opencv_core2410': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
    *** An exception has occurred because of P/Invoke. ***
    Please check the following:
    (1) OpenCV's DLL files exist in the same directory as the executable file.
    (2) Visual C++ Redistributable Package has been installed.
    (3) The target platform(x86/x64) of OpenCV's DLL files and OpenCvSharp is the same as your project's.
    
    System.DllNotFoundException: Unable to load DLL 'opencv_core2410': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
       at OpenCvSharp.NativeMethods.cvReleaseImage(IntPtr& image)
       at OpenCvSharp.Utilities.PInvokeHelper.TryPInvoke()]
       OpenCvSharp.Utilities.PInvokeHelper.TryPInvoke() +56
       OpenCvSharp.NativeMethods..cctor() +173
    
    [TypeInitializationException: The type initializer for 'OpenCvSharp.NativeMethods' threw an exception.]
       OpenCvSharp.NativeMethods.cvCreateMatHeader(Int32 rows, Int32 cols, MatrixType type) +0
       OpenCvSharp.CvMat..ctor(Int32 rows, Int32 cols, MatrixType type, Array elements, Boolean copyData) +45
       OpenCvSharp.IplImage.FromImageData(Byte[] bytes, LoadMode mode) +62
       OpenCvSharp.IplImage.FromStream(Stream stream, LoadMode mode) +163
       MvcApplication1.Controllers.HomeController.Canny(HttpPostedFileBase imageData) +49
       lambda_method(Closure , ControllerBase , Object[] ) +104
       System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +14
       System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +182
       System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27
       System.Web.Mvc.Async.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41() +28
       System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +10
       System.Web.Mvc.Async.WrappedAsyncResult`1.End() +50
       System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +49
       System.Web.Mvc.Async.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33() +58
       System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +225
       System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__36(IAsyncResult asyncResult) +10
       System.Web.Mvc.Async.WrappedAsyncResult`1.End() +50
       System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +49
       System.Web.Mvc.Async.<>c__DisplayClass2a.<BeginInvokeAction>b__20() +24
       System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult) +99
       System.Web.Mvc.Async.WrappedAsyncResult`1.End() +50
       System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27
       System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +14
       System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +16
       System.Web.Mvc.Async.WrappedAsyncResult`1.End() +50
       System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +38
       System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +16
       System.Web.Mvc.Async.WrappedAsyncResult`1.End() +50
       System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +28
       System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10
       System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) +25
       System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +16
       System.Web.Mvc.Async.WrappedAsyncResult`1.End() +50
       System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +28
       System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
       System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9644037
       System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155
    


    Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.6.1055.0             

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

    このようなエラーが出る原因は分かりますでしょうか?

    私が調べた範囲ですが、似たようなエラー内容に関して質問しているサイトがございまして、そのサイトによると仮想ディレクトリを構成する必要があるということが書かれていたのですが、仮想ディレクトリの構成という作業が必要なのでしょうか?

    http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=3437&forum=7参照)

    大変初歩的な質問かもしれませんが、ご回答よろしくお願いいたします。

    最後に私の使用している環境について記載させていただきます。

    ・使用している Visual Studio のバージョン・エディション:Express 2013 for Web
    ・使用している言語の種類等:C#
    ・実行環境の OSのバージョン・エディション(32Bit/ 64Bit):Windows10 Home Home 64Bit  
    ・対象の .NET Framework のバージョン:4.5
    ・プロジェクトの種類:ASP.NET Web フォーム(?)





    2016年10月15日 3:57

すべての返信

  • 質問者さんの先のスレッド(URL 下記)と二重投稿のような形になってしまっています。

    OpenCvSharpの動作確認時のエラーについて
    https://social.msdn.microsoft.com/Forums/ja-JP/30a71c5f-5f46-48c0-9a09-06a2c0c8ab44/opencvsharp?forum=csharpgeneralja

    前の C# のフォーラムのスレッドではこの問題のレスがつかないので、Azure のホーラムに場所を移して改めて質問と言うことだと思いますが、そうであれば前の C# のフォーラムのスレッドで、場所を移すということを書いて、そのスレッドはクローズしていただくようお願いします。

    また、このスレッドの一番最初に、C# のフォーラムのスレッドの続きであることを書いて、その URL も書いてください。そうしてもらえないと、前のスレッドを知らない人には、開発環境では同様な問題を解決するためいろいろやったことが分かりませんので。

    2016年10月15日 4:33
  • ご指摘頂きまして有難うございます。

    質問内容が「C#」というより、「Azure」と思いまして新たにスレッドを立ち上げておりました。

    ご指摘頂きました通りに追記をさせて頂きました。

    引き続き、よろしくお願い致します。

    2016年10月16日 1:21
  • 今回のエラーメッセージ、

    Unable to load DLL 'opencv_core2410': The specified module could not be found. (Exception from HRESULT: 0x8007007E)

    は前のスレッドのものと全く同じ(日本語が英語に変わっただけ)と言うことは気づかれているでしょうか?

    と言うことは、前のスレッドで私がレスした、

    > 質問者さんが最初の質問の 2 枚目の画像のエラーメッセージを見ますと、上に紹介した記事の
    > 「P/Invokeの問題」のセクションにある (1) ネイティブ OpenCv の .dll が見つからない、
    > (2) VC++ Redistributable がインストールされてない、(3) 32 / 64-bit の違いが原因ではな
    > いかと思われます。

    が今回も当てはまるのではないかと思います。

    前のスレッドの質問者さんのレスで、

    > いろいろ試しすぎて何がどのように絡まって動作するようになったかよくわかりませんが、

    というのはその通りなんですが、いろいろ試したことを見ると、上の (1), (2), (3) の問題の解決のための対応だったように思えます。

    特に (3) について、前のスレッドの開発環境では IIS Express を使っていて、多分 32-bit で動かしていたと思いますが、そうであるとすると、Azure Web Apps の IIS のワーカプロセスの動作ビットモードはデフォルトで 64-bit なので、まずここの問題を解決する必要がありそうです。

    (1), (2) を Azure Web Apps でどう対応できるのかは Azure には触ったこともない自分には分かりません。お役に立てずすみませんが、他の Azure に詳しい方の回答をお待ちください。

    それから、(1), (2), (3) が全てクリアできたとしても、前のスレッドで私がレスした Azure Web App の sandbox(特に今回の話と関係しそうなのは graphics 関係の制約)があります。この制約に引っかかると Azure Web App では解決できませんので((1) ~ (3) 解決のための努力が無駄になるかもしれませんので)、これを先に考えた方がいいかもしれません。

    #以下は蛇足的情報です・・・

    質問者さんの環境で使えるのかどうか分かりませんが、Migration Assistant というのがあるそうです。使えるようなら使ってみてはいかがでしょう?(ググっていたらそういう記事が見つかったので紹介しましたが、質問者さんの役に立たなかったらすみません)

    エンタープライズ Web アプリの Azure App Service への移行
    https://azure.microsoft.com/ja-jp/documentation/articles/web-sites-migration-from-iis-server/

    その記事の中で「GAC は Web Apps でサポートされていません」とか「Web Apps では、プラットフォームで COM コンポーネントを登録できません」とか、ちょっと気になります。

    ネイティブの OpenCV の .dll が COM コンポーネントなのか、その記事で言っていることがどう影響するのかは自分には分かりませんが・・・

    2016年10月16日 2:26
  • ご回答ありがとうございます。

    ご指摘頂きました点、調べてみたいと思います。

    とりあえず本日試したことを備忘録の意味で以下に記載させて頂きます。

    (前スレッドのように記載しておかないと試したことを忘れてしまいそうなので)

    上記に記載しましたとおり、仮想ディレクトの構成が必要なのではと考えまして、次のサイトの手順に従って仮想ディレクトリを新規に作成しました。

    https://manual.cybozu.co.jp/tech/webalias/iis7.html

    ※ステップ3の2の物理パスには、[opencv_core2410]のファイルがおいてある場所を指定しました。(エラーメッセージに、opencv_core2410が見つからないという内容でしたので)

    ※ステップ3の4以降は省略した(CGI-exeという表示がなかったため)

    この後にAzureに再発行致しましたが、とくに変化はありませんでした。

    そもそもAzureに発行する場合は、仮想ディレクトリの構成という作業自体が必要ないのでしょうか?(私が持っているAzureの書籍内では、仮想ディレクトリの構成のような項目がありません)

    以上、本日試した内容になります。

    2016年10月16日 3:41
  • > そもそもAzureに発行する場合は、仮想ディレクトリの構成という作業自体が必要ないのでしょうか?

    そのような必要はなくて、何か見当違いのことをされているような気がします。

    そもそも Azure Web Apps の IIS にそのようなことができるとは思えないのですが。質問者さんが行ったのは開発環境での話ですか?

    IIS(IIS Express ではなくて)では、Web アプリのある物理フォルダをアプリケーション(仮想ディレクトリではなくて)に設定しないと ASP.NET Web アプリは動きません。

    一般のホスティングサービスでは、共有サーバーを使う場合、ユーザーが IIS の仮想ディレクトリ / アプリケーションの設定をすることはなく、ホスティングサービス会社の方で特定のフォルダをアプリケーションの設定済みのはずです。(共有でなく占有サーバーを使う場合は分かりませんが。Azure Web Apps は共有サーバーだそうですので同じことかと)

    なので、ユーザーはそのフォルダに自分が作った Web アプリのフォルダ / ファイルをアップロードするだけで動くようになっているはずです。

    Azure Web Apps は共有サーバーだそうですので多分一般のホスティングサービスの共有サーバーの場合と同じだと思います。

    質問者さんの Web アプリは問題の部分以外は Arure Web Apps 上で動いているようなので、Arure Web Apps の IIS では質問者さんが使用するフォルダはアプリケーションに設定済みのはずです。

    2016年10月16日 4:35