java opencv byte[] 转Mat类型遇到的坑

先上测试代码

        Mat mat = new Mat(1024,1024,CV_8UC1);
        byte[] arr = new byte[64];
        Arrays.fill(arr,(byte)0xff);
        //实际需要覆盖多个小图像,这里为简化需求将左上角覆盖一白色方块
        for(int i=0;i<64;i++){
            mat.put(i,0,arr);
        }
        imwrite("test.bmp",mat);

起初我以为这样生成的图片除了左上角是白色其余都是纯黑色,执行一次确实也是这种现象,认为new Mat(1024,1024,CV_8UC1)默认是全0数组。但是在项目中批量处理图像时,发现白色方块之外还有随机点像素不是0。
我的天,经过深入思考以为是我mat.put()时实现错误。把mat.put()注释掉批量测试,还是有随机像素点不是0,但是这几句代码不会有啥问题啊,异常已经超出了我的认知,难道opencv里面有bug?
应该不会吧,还是我代码中有bug更让人信服些。
观察代码,尝试将mat置空数组呢?
new Mat()后加上
mat.put(0,0,new byte[1024*1024]);
再次批量处理测试,发现异常的像素点没有了!
问题得到解决。

为什么其他图像处理时候,没有发现这个问题呢?是因为mat.put()中的数组长度正好和mat矩阵的大小一致。

而我确实也推翻了之前对new Mat的认知,不是默认全0矩阵。
生成全0矩阵还有个实现方式

Mat mat = Mat.zeros(1024,1024,CV_8UC1);

这个问题引发的项目错误困扰了我两天,终于得到解决!

基于java的opencv开发和部署方法可见这儿

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值