OpenCV Java学习笔记(一)--Mat矩阵的数据类型转换

最近正在使用opencv做一些东西,用的是java api。遇到一个问题,用opencv读取一个灰度图的时候,mat对象的数据类型是CV_8UC1,如果直接使用mat.get(int, int, byte[]);

会导致一个错误,那就是这个8位的无符号数(0-255)会变成8位有符号数,所有超过127的数值都会变成负数。

解决办法有三种:

1. 最土的办法,如果仅仅是想读取一个像素,那么完全可以用mat.get(int, int),这个方法会返回一个double类型的像素值,可以把它强制转换为int等其他类型。

2. 判断每一个像素值,如果是负数,就加上256,也可以解决,不过这办法真心。。。你懂得。

3. 正规的办法,使用mat.convert(mat,CvType.CV_32S),这个方法将会把mat的元素类型转换为其他类型,例如将灰度图的CV_8UC1转换为CV_32S等,这样,就可以使用

mat.get(int, int, int[])方法取得正确的像素值。

附上例子:

public class TestOpenCV
{
    public static void main( String[] args )
    {
      System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
      Mat mat = Highgui.imread("
image file path", Highgui.CV_LOAD_IMAGE_GRAYSCALE);
      mat.convertTo(mat, CvType.CV_32S);
      int size = (int) (mat.total() * mat.channels());
      int[] temp = new int[size];
      mat.get(0, 0, temp);
      System.out.println("end");
   }


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值