OpenCV Java学习笔记(一)--Mat矩阵的数据类型转换
2015-01-24 16:11
337 查看
最近正在使用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");
}
会导致一个错误,那就是这个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");
}
相关文章推荐
- jdbc的连接问题-----java数据学习笔记之2
- JAVA 数据结构与算法学习笔记一(转载)
- java学习笔记三——数据类型转换
- 黑马程序员J_ava学习笔记_Java中的基本数据类型转换详解
- OpenCV学习笔记(四十一)——再看基础数据结构core
- 数据连接部分通过测试源代码-----java学习笔记之4
- java学习笔记二——数据类型
- Java学习笔记四。设计模式、基本数据类型、包装类、异常、断言、包、访问权限、命名规范、jar
- Java学习笔记(一) Java基础以及数据类型介绍
- OpenCV学习笔记 -- 基本数据类型
- Java学习笔记---2.Java标识符和基本数据类型
- objective-c学习笔记第七章《objective-c 数据类型和变量与java中的区别》
- Java基础学习笔记(一)基本数据类型
- java学习笔记(二)--数据的溢出
- Java开发学习笔记之三:HTTP客户请求数据格式
- java学习笔记三(Java数据类型)
- JAVA高级视频_IO输入与输出 Java程序与其他进程的数据通讯 学习笔记
- J2SE学习笔记3 — Java基本语法(2)基本数据类型
- java学习笔记---数据类型、运算符和控制语句
- (JAVA SE 学习笔记)Java.SE.第003讲.原生数据类型使用陷阱.Pitfall.of.Primitive.Data.Type