前提・実現したいこと
Visual Basic.NETでOpenCVSharpを使用し、画像認識による自動化ソフトを作成しています。
機能の1つを実装するために、GetIndexer()を使用してMatのピクセルデータにアクセスするコードを書いています。
現在OpenCVSharp 4.1.0.20190416を使用しており、最新バージョン(4.4.0.20200725)にアップデートしようとしたところ、以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
Error
1エラー BC32044 型引数 'Vec3b' は、制約型 '?' から継承したり、この型を実装したりしません。 2エラー BC30649 '' の型はサポートされていません。
該当のソースコード
VBNET
1'Version 4.1.0.20190416 2Dim src As Mat = New Mat("xxx.png", ImreadModes.AnyColor) 3 4Dim matofbyte_tpl As MatOfByte3 = New MatOfByte3(src) 5Dim indexer_tpl As MatIndexer(Of Vec3b) = matofbyte_tpl.GetIndexer() 6 7For y = 0 To src.Height - 1 8 For x = 0 To src.Width - 1 9 10 '各ピクセルのRGB値を取得 11 Dim rgb As Vec3b = indexer_tpl(y, x) 12 Debug.WriteLine("R:{0}, G:{1}, B:{2}", rgb(2), rgb(1), rgb(0)) 13 14 Next 15 16Next 17 18 19'Version 4.4.0.20200725 20Dim src As Mat = New Mat("xxx.png", ImreadModes.AnyColor) 21 22Dim matofbyte_tpl As Mat(Of Vec3b) = New Mat(Of Vec3b)(src) 'この行でエラーが発生します。 23Dim indexer_tpl As MatIndexer(Of Vec3b) = matofbyte_tpl.GetIndexer() 24 25For y = 0 To src.Height - 1 26 For x = 0 To src.Width - 1 27 28 '各ピクセルのRGB値を取得 29 Dim rgb As Vec3b = indexer_tpl(y, x) 30 Debug.WriteLine("R:{0}, G:{1}, B:{2}", rgb(2), rgb(1), rgb(0)) 31 32 Next 33 34Next
試したこと
バージョン4.1.0.20190416から4.1.1.20191017へのアップデートで使用できなくなったことを確認しました。
OpenCVSharpのコミットを見てみると、MatOfXXXというクラス?が削除され、以下のように記述するようになったようです。
https://github.com/shimat/opencvsharp/compare/4.1.0.20190417...4.1.1.20191023
C#
1- using (var imgt = new MatOfByte3(img)) 2+ using (var imgt = new Mat<Vec3b>(img))
C#で記述したところ正常に動作することを確認できたので、VB.NETでの書き方に問題があると考えています。
C#
1Mat src = new Mat("xxx.png", ImreadModes.AnyColor); 2Mat<Vec3b> matofbyte_tpl = new Mat<Vec3b>(src); 3MatIndexer<Vec3b> indexer_tpl = matofbyte_tpl.GetIndexer(); 4 5for (int y = 0; y < src.Height; y++) 6{ 7 for (int x = 0; x < src.Width; x++) 8 { 9 Vec3b rgb = indexer_tpl[y, x]; 10 11 Debug.WriteLine("R:{0}, G:{1}, B:{2}",rgb[2],rgb[1],rgb[0]); 12 13 } 14}
エラー内容を調べ、解決方法も見てみたのですが、型パラメーターに指定されたすべてのインターフェイスを実装し~ や、サポートされる型を使用、新しい型を開発等と書かれており、理解が及ばず質問させていただいた次第です。
よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
開発環境
VisualStudio 2019
VisualBasic
Microsoft .Net Framework 4.7.2
追記(2020-07-26 13:26)
以下のコードでもMatへのアクセス(RGB値の取得)を行うことができました。シンタックスハイライトが少しおかしいような…?
VBNET
1'Imports System.Runtime.InteropServices 2'Imports OpenCvSharp 3 4Dim src As Mat = Cv2.ImRead("xxx.png", ImreadModes.AnyColor) 5Dim bgr As Byte() = New Byte(3 * src.Total() - 1) {} '画像のピクセル数xチャンネル数分のByte配列を確保する。 6 7Marshal.Copy(src.Data, bgr, 0, bgr.Length) 8 9For i = 0 To bgr.Length - 1 Step 3 10 '(B,G,R)=(255,0,0)…全体を青色にしてみる 11 bgr(i) = 255 'B 12 bgr(i + 1) = 0 'G 13 bgr(i + 2) = 0 'R 14 15Next 16 17Marshal.Copy(bgr, 0, src.Data, bgr.Length) 18 19Cv2.ImShow("Result", src)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/26 03:01 編集
2020/07/26 04:25
2020/07/26 08:49