OpenCVSharp Installation Memo

Reference

https://github.com/shimat/opencvsharp

Install OpenCVSharp

1年ぶりくらいにOpenCVSharp を使おうと思ったら、OpenCVのバージョンアップに伴い、若干 I/F に変更があったようなので、一部動かなくなっていた。そこで、環境構築と修正のメモです。

環境

Microsoft Visual Studio Community 2019 Version 16.7.3

OpenCVSharp 4.4.0

インストール手順

Reference にある手順書に従い、Visual Studio の Nuget パッケージの管理から、OpenCvSharp4, OpenCvSharp4.nuntime.win をインストールする。

古いバージョンからの変更点

注意

Bitmap.GetHbitmap メソッド のメモリーリークに関して

その他注意事項

インストールパッケージを作成すると、プログラムが動作しない。原因を調査したところ、インストールパッケージに OpenCvSharpExtern.dll が含まれていない。依存関係が正しくセットされいないのかもしれない。

対応として、インストールパッケージに対応する OpenCvSharpExtern.dll を追加する。このときの注意点として、OpenCvSharpExtern.dll には、Release/Debug, 64/x86 の4種類のファイルが存在している。正しいバージョンを追加しないと動作しないので注意。ここでは、

自分の環境では、32bit 版でビルドしているので、

*****\bin\Release\dll\x86\OpenCvSharpExtern.dll
を追加する。

Dependency Walker について

shimat さんのメモによると、この問題はあちこちで起こっているようで、Dependency Walker を使うとdllの依存関係を調査するのに便利とありました。
しかしながら、自分の環境(Win 10)では、 Dependency Walker V2.2に exe を追加すると、フリーズしてだめでした。Dependency Walker のあとにリリースされている Dependencies も試してみましたが、こちらも自分の環境では起動すらできませんでした。

Visual Studio でアイコンが編集できない!?

Visual Studio 2019 Community で、Icon を編集しようとしたら、編集用のボタンがグレーアウトされていて、編集できない!?

と思ったら、32ビット画像が編集できないのは、by Design (仕様)だそうです。Visual Studio のIcon エディタを使用するには、8ビットカラーであれば、次の通り。

WPFでメニューが左に表示される問題

ある日、突然WPFのメニュが左側に出るようになりました。

解決策は、次にあるように  HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows の MenuDropAlignmentを0に変更し、再ログインすることで解決しました。どこで書き換わってしまったかは謎です。

Why Menu Items Box is aligned at left when created in XAML & WPF [duplicate]

OpenCvSharp

OpenCvSharp でC#で組めるのはいいですね。中のソースを少し見てみましたが、shimatさんに感謝!

OpenCv のPython のチュートリアルに近い形で実装した場合

これだとキー待ちでループして気持ち悪いので、もう少し C# らしく書くと、こんな感じかな。

リモートパーティがトランスポートストリームを終了したため、認証に失敗しました。

表題のエラーが発生。

‘/’ アプリケーションでサーバー エラーが発生しました。

説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。 

例外の詳細: System.IO.IOException: リモート パーティがトランスポート ストリームを終了したため、認証に失敗しました

スタック トレース:

[IOException: リモート パーティがトランスポート ストリームを終了したため、認証に失敗しました。] System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest) +6803088 System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest) +132 System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest) +281 System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest) +49 System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest) +162 System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult) +542 System.Net.TlsStream.CallProcessAuthentication(Object state) +42 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) +228 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) +21 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) +64 System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result) +795 System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size) +52 System.Net.PooledStream.Write(Byte[] buffer, Int32 offset, Int32 size) +21 System.Net.ConnectStream.WriteHeaders(Boolean async) +388

[WebException: 接続が切断されました: 送信時に、予期しないエラーが発生しました。。] System.Net.HttpWebRequest.GetResponse() +1399 System.Xml.XmlDownloadManager.GetNonFileStream(Uri uri, ICredentials credentials, IWebProxy proxy, RequestCachePolicy cachePolicy) +83 System.Xml.XmlDownloadManager.GetStream(Uri uri, ICredentials credentials, IWebProxy proxy, RequestCachePolicy cachePolicy) +99 System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri, String role, Type ofObjectToReturn) +69 System.Xml.XmlTextReaderImpl.FinishInitUriString() +76 System.Xml.XmlTextReaderImpl..ctor(String uriStr, XmlReaderSettings settings, XmlParserContext context, XmlResolver uriResolver) +186 System.Xml.XmlReaderSettings.CreateReader(String inputUri, XmlParserContext inputContext) +66 System.Xml.XmlReader.Create(String inputUri, XmlReaderSettings settings, XmlParserContext inputContext) +45 System.Xml.Linq.XDocument.Load(String uri, LoadOptions options) +45 h

原因は、XDocument.Load で読み込んでいたrssのサービスが終了していたため。

ASP.NET MVC ActionResultの派生型

http://msdn.microsoft.com/ja-jp/magazine/dd695917.aspx

「ASP.NET MVC Controller の動作」より、ActionResult のディライブドクラスを抜き出したもの。

名前 フレームワークの動作 生成メソッド
ContentResult 文字列値を HTTP 応答に直接書き込みます。 Content
EmptyResult HTTP 応答に書き込みません。  
FileContentResult ファイルの内容 (バイトの配列として表される) を取得し、HTTP 応答に書き込みます。 File
FilePathResult 指定した場所にあるファイルの内容を取得し、HTTP 応答に書き込みます。 File
FileStreamResult コントローラによって生成されたファイル ストリームを取得し、HTTP 応答に書き込みます。 File
HttpUnauthorizedResult 承認チェックが失敗したときに承認フィルタによって使用される特殊な= 結果です。  
JavaScriptResult クライアントが実行するスクリプトをクライアントに返します。 JavaScript
JsonResult JavaScript Object Notation (JSON) のデータをクライアントに返します。 Json
RedirectResult クライアントを新しい URL にリダイレクトします。 Redirect
RedirectToRouteResult 指定されたビューをレンダリングして HTML フラグメントを返します (通常は AJAX のシナリオで使用されます)。 RedirectToRoute / RedirectToAction
PartialViewResult 指定されたビューをレンダリングして HTML フラグメントを返します (通常は AJAX のシナリオで使用されます)。 PartialView
ViewResult 指定されたビューをレンダリングして HTML をクライアントに返します。 View

MVC 3 入れる前のプロジェクトテンプレート

MVC 3 を入れる前のプロジェクトテンプレートを記念?にスクリーンショット

image

さて、MVC 3を入れるとどうなるか・・・

単に MVC 3 が増えただけだったw

image

しかし、MVC 3を選ぶと、Razor ビュー エンジンがもれなくついてくる。

image

Razor で、ようやくMVCを使う気になってきた。

WebBrowser で、innterTextやリンクを取得する方法

環境: Visual Studio 2010 / WPF

インターネット上のHTMLより、リンクや文書を取得するには、単にWebClient でHTMLを取って来て、処理すればいいのですが・・・

とある理由でHTMLをブラウズしながら、ドキュメントに含まれるリンクなどを取得する必要があったので、WebBrowser を使って作ってみました。

WebBrowser は、裏側で mshtml の COMで実装されているので、ちょっと使い方が面倒だったのでメモしておきます。

 

参照の追加より、COM のmshtml.tlb を追加する。

image

 

WebBrowserに対して、Navigate でブラウズする。

Navigated イベントだと、document を完全に取得する前に、Navigated イベントが発生してしまう。

そこで、Document が完全にロードを完了したイベントとして、LoadCompleted を使用する。

 

例1: innterTextを取得する場合

例2: リンクの HTML をリストする場合

実際の実行結果はこんな感じ。

image

TMScreensaver V0.3

バージョンV0.3 をリリースします。

修正点。セキュリティ面を強化。設定ファイルに対応。エラー時のログ生成。その他、いろいろ w

アカウント情報の保存方法を強化しました。人柱になって古いバージョンをインストールされた方は、この新しいバージョンをインストールする前に、古いアカウント情報を削除してください。古いアカウント情報を削除するには、レジストリの CurrentUser\Software\Uchukamen\TMScreensaver 以下を削除してください。

[1] 名称
    TMScreensaver

[2] 概要
    映画 Matrix のように Twitter のタイムラインを縦に流れるように表示するスクリーンセーバー

[3] バージョン
    0.3

[4]    ダウンロード
http://cid-7cb203a44bf94940.skydrive.live.com/browse.aspx/TMScreensaver
    より、TMS03.zip をダウンロードしてください。

[5] 動作環境
    .NET Framework 4.0 が動く環境
    32bit 版
    グラフィックアクセラレータを搭載していること

[6] 必要条件
    .NET Framework 4.0
http://www.microsoft.com/downloads/details.aspx?FamilyID=9cfb2d51-5ff4-4491-b0e5-b386f32c0992&displaylang=ja

[7] インストール方法
    1.TMSetup.msi を実行し、インストールを行う。
    2.コントロールパネル→スクリーンセーバーから、Tmscreensaverを選択
    3.スクリーンセーバーの設定ボタンを押す
    4.TMScreensaver Configurationダイアログが表示されるので、次の情報を入力
        Username…twitter のユーザーアカウントを入力
        Password…twitter のパスワードを入力
        Font Size…スライダーを移動し、適当なサイズに設定
    5.OKボタンを押すと、設定情報をレジストリに格納
    6.プレビューボタンを押し、プレビューで動作を確認

[8] アンインストール方法
    1.コントロールパネル→プログラムのアンインストールより、TMScreensaver を削除   

[9] 注意制限
    1.最大タイムラインは200個
    2.通信エラー等発生した場合は、白いメッセージを表示

[10] 完全に削除する方法

  1. 解凍したフォルダーを削除
  2. レジストリの CurrentUser\Software\Uchukamen\TMScreensaver 以下を削除

[11] 各種設定
    TMScreensaver.exe.config のXMLファイルを修正する

    MaxTweets…タイムラインの同時表示数
    BackColor…背景色
    ForeColor…文字色
    ErrorColor…エラーメッセージの文字色
    FontSize…タイムラインのフォントサイズ
    Rotation…メッセージの方向(-90…上から下へ、0…左から右へ)
    ShowImage…プロファイルアイコンの表示(Visible)、非表示(Hide)

[12] バグ報告、要望など
    uchukamen宛に、#TMScreensaver タグでつぶやいてください。
    クラッシュ時には、TMScreensaverLog.txt というログファイルが
    このフォルダーに作成されるので、それを送ってください。

Matrix のような WPF によるツイッタースクリーンセーバーを作ってみた

画面

image 

[1] 名称
    TMScreensaver

[2] 概要
    映画 Matrix のように Twitter のタイムラインを縦に流れるように表示するスクリーンセーバー

[3] バージョン
    0.2

[4]    ダウンロード
http://cid-7cb203a44bf94940.skydrive.live.com/browse.aspx/TMScreensaver
    ここより、Readme.txt と TMSetup.msi をダウンロードしてください。

[5] 動作環境   
    .NET Framework 4.0 が動く環境
    32bit 版
    グラフィックアクセラレータを搭載していること

[6] 必要条件
    .NET Framework 4.0
http://www.microsoft.com/downloads/details.aspx?FamilyID=9cfb2d51-5ff4-4491-b0e5-b386f32c0992&displaylang=ja

[7] インストール方法

  1. TMS.zip を適当な場所で解凍
  2. TMScreensaver.exe.scr を右クリックして、インストールを選択
  3. スクリーンセーバーの接待画面が表示されるので、設定ボタンを押す
  4. TMScreensaver Configurationダイアログが表示されるので、次の情報を入力
  5. Username…twitter のユーザーアカウントを入力
  6. Password…twitter のパスワードを入力
  7. Font Size…スライダーを移動し、適当なサイズに設定
  8. OKボタンを押すと、設定情報をレジストリに格納
  9. プレビューボタンを押し、プレビューで動作を確認

[8] アンインストール方法

  1. TMS.zip を解凍したフォルダーを削除
  2. レジストリの CurrentUser\Software\Uchukamen\TMScreensaver 以下を削除

[9] 注意制限
    1.最大タイムラインは200個
    2.通信エラー等発生した場合は、白いメッセージを表示

[10] バグ報告、要望など
    uchukamen宛に、#TMScreensaver タグでつぶやいてください。