Problem
掲題の件、普通は下記のような形でRAWデータ (ここでは、画素値だけを格納したデータ形式) だけを抜き出す。
1 | var mat = Cv2.ImRead(@"Test.png", ImreadModes.GrayScale); |
問題は、あるMatからROIを指定した後に、ROIで抽出されたMatをRAWデータを抜き出す場合。
つまり下記のようなケース。
1 | var mat = Cv2.ImRead(@"Test.png", ImreadModes.GrayScale); |
上記のケースで抜き出されるRAWデータは壊れているようなデータになる。
ROIを指定した場合、抜き出されたMatは、元のMatのデータ領域を指し示しているだけで、コピーでは無い。
そのため、抜き出されたMatのDataプロパティからポインタを介してメモリ領域から連続したデータを抜き出しても意味が無い。
Solution
回答は下記。
1 | var mat = Cv2.ImRead(@"Test.png", ImreadModes.GrayScale); |
OpenCvSharp.Mat.CopyToメソッドを利用して、ROIで切り出したMatを新しく確保したMatにコピーしています。
これで意図した結果になります。