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 も試してみましたが、こちらも自分の環境では起動すらできませんでした。

System.Windows.Markup.XamlParseException

現象

プロジェクトをコピーして、アイコンを変更しているときに、次のエラーが発生するようになった。

System.Windows.Markup.XamlParseException
HResult=0x80131501
Message=’System.Windows.Baml2006.TypeConverterMarkupExtension’ の値の指定時に例外がスローされました。
Source=PresentationFramework
スタック トレース:
場所 System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)

内部例外 1:
IOException: リソース ‘iconname.ico’ を検索できません。

なお、プロジェクトには、IconName.ico ファイルは存在している。

対応

Xaml の中で、

<Window
xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”
…中略…
Closing=”Window_Closing” VerticalAlignment=”Top” Height=”302.5″ Width=”727″ SizeToContent=”WidthAndHeight” Icon=”IconName.ico”>

Icon=”IconName.ico” となっていた。
これを
Icon=”iconname.ico” と修正する。

原因

ファイル名をOriginalIconName.ico から、IconName.ico に変更した。これにあわせて、リファクタリングで、OriginalIconName.ico を IconName.ico に変換した。xaml も当然、IconName.ico に書き換えられた。ファイル名もIconName.icoなので、このままで良いはずだが、この書式は、大文字小文字を識別していて、なおかつ小文字に出ないとダメなようです。

OpenCV + Python で Video でネガポジ変換

昔の写真とネガを整理していて、写真とネガが別々に保存していました。このため、ネガイメージからだとどのネガがどの写真に対応しているのか、確認が難しいです。そこで、OpenCV + Python を使って、ネガポジ変換を行ってみました。

単純に、ネガポジ変換だけだと、全体的に青みがかった画像になり、思った色になりませんでした。そこで、青みがかった色を修正するために、ホワイトバランスの修正を行っています。これは、照明、撮像デバイス、ネガなどにより、パラメータを調整する必要があります。

ホワイトバランスは、単純にRGBのフィルムを通過した光のダイナミックレンジを一次式で正規化しているだけです。

つぎに、彩度が薄い感じだったので、RGBをHSV に変換し、彩度を1.5倍に上げてから、RGBに戻しています。これでだいたい何が写っているのか判別できるようになりました。

ほかの照明や撮像デバイスが異なると、色合いがおかしくなったりすると思いますが、地道にパラメータを調整する必要があります。

Swift UIKit Localization

Menu > File > New > File…から、次のようにStrings Fileを選択し、プロジェクトに追加する。この時のファイル名は、”Localizable.strings” とする。ファイル名の先頭は、必ず大文字Lにする。そうしないと、Localizeされない。

“Localizable.strings” ファイルのコンテクストメニューから、”Show File Inspector” を選択し、English と Japanese を追加する。(下図参照)

コードでローカライズする場合は、次の通り。

storyboardをローカライズする場合は、PROJECT > Info > Localizations から、English, Japanese を追加する(下図参照)。

この時、”Interface Builder Storyboard” を選択する。そうすると、Interface Builderで、ローカライズ画面をデザインできる。

シミュレータのロケールは、Menu > Product > Scheme > Edit Schemeから、Application Language で選択する(下図参照)。

Failed to instantiate the default view controller エラー

次のようなエラーが発生した場合、View Controller の “Is Initial View Controller” のチェックが外れており、最初にキックされる View Controller が存在していないか、確認する。Initial View Controllerがないと、アプリの起動画面が真っ黒になり、何も表示されない。

[WindowScene] … Failed to instantiate the default view controller for UIMainStoryboardFile ‘Main’ – perhaps the designated entry point is not set? for UIMainStoryboardFile ‘Main’ – perhaps the designated entry point is not set?

および、Build Settings > Packaging > Info.plist File のパスを変更

xcode でプロジェクトをコピーして、リネームした場合のエラー対応

xcode でプロジェクトをコピーして、リネームした場合、次のエラーが発生した。

Build input file cannot be found: パス名/Info.plist

対応としては、プロジェクト > General > Identity > Choose Info.plist File から、Info.plist を選択し、再ビルドする。

UIPickerView

Tap, LongPress

viewDidLoadで通知設定を行い、ViewController を繰り返し使用する場合、通知が複数回登録されてしまう。
この場合、
override func viewDidDisappear(_ animated: Bool) で、次のように通知を削除する。
        NotificationCenter.default.removeObserver(self)

AlertController / アクションシート