首页 > 编程语言 >OpenCV-像素值读写(java版)

OpenCV-像素值读写(java版)

时间:2022-10-11 22:03:07浏览次数:53  
标签:java mat idx get int 0.0 像素 OpenCV data

@​​TOC​​​

很多时候,我们需要读取某个像素值,或者设置某个像素值,甚至需要遍历整个像素值。

​​​OpenCV中RGB图像的通道为BGR!!!​

1. 读像素值

1.get()函数

OpenCV中使用get()方法来实现读去矩阵中的某个像素。下方是提供的方法

方法

说明

get(int row, int col)

返回double[] 类型的像素数据

get(int[] idx)

get(int row, int col, byte[] data)

支持 CV_8UC(ch)、CV_8SC(ch)(ch 表示通道数,支持1-4,下方支持类型一样的道理)

get(int[] idx, byte[] data)

get(int row, int col, short[] data)

支持 CV_16S(ch)、CV_16U(ch)

get(int[] idx, short[] data)

get(int row, int col, int[] data)

支持 CV_32S(ch)

get(int[] idx, int[] data)

get(int row, int col, float[] data)

支持 CV_32F(ch)

get(int[] idx, float[] data)

get(int row, int col, double[] data)

支持类型为CV_64F(ch)

get(int[] idx, double[] data)

参数说明

row,col :分别代表在图像中所在的y,x的位置(可以理解图像的坐标点,xy轴。一遍从左上角开始,再直白点就是可以理解为分别代表照片的宽高)

data :图像元素值,返回的data类型根绝图像类型而定

idx:长度为2的数组,{row,col}

2.示例

​以下以​CV_8UC3​为例,对上述部分方法进行演示​

  1. get(row,col)​​执行下方main方法​
public static void main(String[] args) {
String libraryPath= System.getProperty("user.dir")+"\\lib\\opencv_java460.dll";
System.load(libraryPath);
Mat mat = new Mat(3,3, CvType.CV_8UC3);
int rows=mat.rows();
int cols=mat.cols();
//遍历所有像素值
for (int i=0;i<rows;i++){
for (int j =0;j<cols;j++){
//get(row,col) 演示
double[] scalarVal=mat.get(i,j);
System.out.println("mat["+i+","+j+"]"+"元素值:B="+scalarVal[0]+"G="+scalarVal[1]+"R="+scalarVal[2]);
}
}
}

结果

mat[0,0]元素值:B=0.0G=0.0R=0.0 mat[0,1]元素值:B=0.0G=0.0R=0.0 mat[0,2]元素值:B=0.0G=0.0R=0.0 mat[1,0]元素值:B=0.0G=0.0R=0.0 mat[1,1]元素值:B=0.0G=0.0R=0.0 mat[1,2]元素值:B=0.0G=0.0R=0.0 mat[2,0]元素值:B=0.0G=0.0R=0.0 mat[2,1]元素值:B=0.0G=0.0R=0.0 mat[2,2]元素值:B=0.0G=0.0R=0.0

2.get(int[] idx)

public static void main(String[] args) {
String libraryPath= System.getProperty("user.dir")+"\\lib\\opencv_java460.dll";
System.load(libraryPath);
Mat mat = new Mat(3,3, CvType.CV_8UC3);
//通过ids获取,ids值分别为row,col
int[] ids ={1,2};
double[] scalarVal= mat.get(ids);
System.out.println("元素值:B="+scalarVal[0]+"G="+scalarVal[1]+"R="+scalarVal[2]);
}

结果为

元素值:B=0.0G=0.0R=0.0

3.get(int[] idx, byte[] data)

public static void main(String[] args) {
String libraryPath= System.getProperty("user.dir")+"\\lib\\opencv_java460.dll";
System.load(libraryPath);
Mat mat = new Mat(3,3, CvType.CV_8UC3);
int[] ids ={1,2};
//获取第一行,第2列
byte[] data =new byte[mat.channels()];
int B = data[0]&0xff;
int G = data[1]&0xff;
int R = data[2]&0xff;
mat.get(ids,data);
System.out.println("元素值:B="+B+"G="+G+"R="+R);
}

结果

元素值:B=0G=0R=0

2.写像素值

1.put()函数

​OpenCV中使用put()方法来实现像素的创建。方法和get()方法相对应。​​,下方仅举出不一样的几个方法

方法

说明

put(int[] idx, double... data)

data:通道对应的元素值

put(int[] idx, byte[] data, int offset, int length)

offset: 偏移量,向左(+)或向右(-)迁移通道对应的元素值。无值时,默认补0

length:图像元素长度

put(int row, int col, byte[] data, int offset, int length)

2.示例

1.put(int[] idx, double... data)

public static void main(String[] args) {
String libraryPath= System.getProperty("user.dir")+"\\lib\\opencv_java460.dll";
System.load(libraryPath);
//创建一个200*200 8位3通道的蓝色图像
Mat matB =new Mat(200,200, CvType.CV_8UC3,new Scalar(255,0,0));
int rows =matB.rows();
int cols =matB.cols();
for (int i=0;i<rows;i++){
for (int j=0;j<cols;j++){
if (i>=99 && j>=99){
int[] idx={i,j};
matB.put(idx,0,255,0);
}
}
}
HighGui.imshow("matB",matB);
HighGui.waitKey(0);
}

执行效果

OpenCV-像素值读写(java版)_i++

2.put(int[] idx, byte[] data, int offset, int length)

public static void main(String[] args) {
String libraryPath= System.getProperty("user.dir")+"\\lib\\opencv_java460.dll";
System.load(libraryPath);
//创建一个200*200 8位3通道的蓝色图像
Mat matB =new Mat(200,200, CvType.CV_8UC3,new Scalar(255,0,0));
int rows =matB.rows();
int cols =matB.cols();
//创建3*3矩阵图像
Mat mat = new Mat(3,3, CvType.CV_8UC3,new Scalar(0,208,91));
int[] ids ={1,2};
byte[] data =new byte[mat.channels()];
mat.get(ids,data);
int B = data[0]&0xff;
int G = data[1]&0xff;
int R = data[2]&0xff;
System.out.println("mat初始值:B="+B+",G="+G+",R="+R);
for (int i=0;i<rows;i++){
for (int j=0;j<cols;j++){
if (i>=99 && j>=99){
int[] idx={i,j};
//赋mat的值给matB,并将元素值向右偏移一位
matB.put(idx,data,-1,data.length);
}
}
}

//获取 199,199位置的图像元素值
int[] ids1 ={199,199};
byte[] data1 =new byte[matB.channels()];
matB.get(ids1,data1);
int B1 = data1[0]&0xff;
int G1 = data1[1]&0xff;
int R1 = data1[2]&0xff;
System.out.println("最终元素值:B="+B1+",G="+G1+",R="+R1);
HighGui.imshow("matB",matB);
HighGui.waitKey(0);
}

执行结果

mat初始值:B=0,G=208,R=91 最终元素值:B=0,G=0,R=208

OpenCV-像素值读写(java版)_scala_02

标签:java,mat,idx,get,int,0.0,像素,OpenCV,data
From: https://blog.51cto.com/u_15820731/5745661

相关文章

  • 使用JavaScript控制HTML元素的显示和隐藏
    使用JavaScript控制HTML元素的显示和隐藏利用来JS控制页面控件显示和隐藏有三种方法,两种方法分别利用HTML的style中的两个属性,两种方法的不同之处在于控件隐藏后是否还在......
  • java中的递归和简易计算器
    递归、简易计算器递归就是:A方法调用A方法,自己调用自己递归结构包括两个部分:递归头:什么时候不调用资深方法。如果没有头,将陷入死循环。递归体:什么时候需要调用自身方......
  • 学校Java Week5
    Week5W5L1ReviewControlFlowConditionLoopscounterLoopsForloopsDoestheexactsamethingwithlesscodefor(inti=0;i<10;i++)//initialvalue......
  • Java-Day05 while/do-while/多重嵌套例题/break/continue
    学习时间:2022/10/10-2022/10/11一、while循环1.结构:①初始化条件While(②循环条件[布尔类型]){③循环体;④迭代条件;}执行过程:①-②......
  • 新人小白学Java第一天笔记
    一、标识符1关键字2标识符注意(1)所有的标识符都应该以字母(A-Z或者a-z),美元符($),或者下划线(_)开始(2)首字符之后可以是字母(A-Z或者a-z),美元符($),或者下划线(_)或数字的任何字符......
  • ActiveMQ启动报错(端口被占用):java.lang.IllegalStateException
    ActiveMQ端口被异常占用这个问题太恶心了,启动Tomcat,默认的端口是8080,死活启动不了,看着报错信息就是端口被占用,网上一直搜索解决办法:netstat-aon|findstr"8080" 然......
  • Java的匿名内部类
    匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口 实......
  • java中的泛型总结
    要我直接说出泛型是个what我还真讲不出来,这里先由一道问题引入:定义一个坐标点类,要求能保存各种类型的数据,如:整形,浮点型,和字符串类型既然变量类型起先不确定,那么很容易想到......
  • JAVA的内部类
    内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类如同一个人是由大脑、肢体、器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的......
  • idea javaWeb tomcat报Driver ClassNotFoundException解决办法
    1.在WEB-INF目录下创建lib目录(如果没有的话),再接着将mysql-connection的jar报复制过来放到lib目录下  2.再点击file-ProjectStructure-Modules,接着点击右上角......