c#的opencvsharp与c++封装opencv之间的mat对象传递
暨BitmapData造成图片扭曲的问题记录
最近韭菜在处理c#的opencvsharp与c++封装opencv之间传递mat数据时,被一个问题坑了一大把,在此将坑及解决方案贴出来,给各位一点解决问题的提示。
首先,我采用opencvsharp来进行c#端的简单图像处理,安装方法这里不再赘述,请自行百度。
我的封装使用如下图:
c++部分:
c#部分:
于是你们猜我看到了什么?
图像被扭曲了!!!!为甚么呢?为什么每一行都多了一个像素点呢?
经过查找相关信息,问题出在这里:
BitmapData类的Stride属性在MSND中的解释为:
Offset, in bytes, between consecutive scan lines of the bitmap. If the stride is positive, the bitmap is top-down. If the stride is negative, the bitmap is bottom-up.
什么意思呢?就是说Stride值必须是4的倍数,当Stride不是4的倍数时,取大于等于Stride值的最小4的倍数。
举个例子:
当实际扫描宽度为125时 ,125除以4商31余1,这时Stride的取值就是4乘32等于128.
还有一点需要注意的事,以8uc3图为例(三通道图),每一个像素点有三个8位,即r-8,g-8,b-8。
所以一个opencv计算得出的宽度为100的图像,实际扫描宽度为300(注:300/4=75).扫描高度与原高度相同。
100*100像素点的图像,实际转为byte[]的长度为100*100*3;
150*150像素点的图像,实际转为byte[]的长度为150*(452);(150*3/4=112...2,所以宽度取113*4=452)
纠正后的方法如下:
测试方法处替换为您自己的c++封装方法即可。