c#的opencvsharp与c++封装opencv之间的mat对象传递(BitmapData造成图片扭曲的问题记录)

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++封装方法即可。

 

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值