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

博主在使用OpenCV进行Java图像处理时遇到一个奇怪的问题:生成的图片中,非指定区域存在随机非零像素点。经过排查,发现`newMat()`并不保证初始化为全零矩阵。通过`mat.put()`填充全零数组或者使用`Mat.zeros()`创建全零矩阵可以解决问题。这个小bug困扰了博主两天,最终成功解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先上测试代码

        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开发和部署方法可见这儿

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值