最近有些忙,研究的东西有些多,一直没顾上写.
在完成适时处理的工作时,我们时常需要优化我们的程序,对每一行每一个函数都仔细推敲,每一次微秒级别的提升,合并入系统中时都有可能都能带来性能流畅度的可以观察到的提升。
opencv有很多矩阵运算相当重要,看到有某些人在很好的算法里嵌入了双重循环自己赋值了,做加减乘除旋转运算,这样效率比较低,大数组的运算,OPENCV底层C语言调用了GPU,远比我们自己写方法要简单和速度快,不应该把算法工程师设计的很好的算法节省的时间再使用一些不高效的编码浪费掉,因此要编码也是一个很重要的工作,必须想办法使用更紧凑或者更高级的API来实现。在这点上,精通C语言嵌入式编程的同学非常的深的印象,在很久以前有个叫林锐的大神,写过一些高效使用C和C++的例子,非常具有启迪,他们会if,for的不同位置对代码运行的影响,而JAVA这方面很少见到有大神提到高效或者推敲API或者关健字的文章。硬件的飞速发展让人变懒了,不再去挖空心思去写机器喜欢的代码。
矩阵运算尽量调用OPENCV的库,网上有朋友测试,OPENCV运算速度是STL的快一百倍以上
图像90度角旋转,相机拍摄过程中,由于CAMEAR方向和手机方向不一致,常常需要对获取的数据做翻转
逆时针旋转90度
Core.transpose(data, data);
Core.flip(data, data, 0);
顺时针旋转90度
Core.transpose(data, data);
Core.flip(data, data, 1);
上下翻转
Core.flip(data, data, 0);
左右翻转
Core.flip(data, data, 1);
转置矩阵,对角线翻转
Core.transpose(data, data);
图像增加alpha通道,并设置半透明,MAT默认读取图像是BGR,
Mat in2 = Imgcodecs.imread("D://result//201508030116541673X1.png", Imgcodecs.IMREAD_UNCHANGED);
if (in2.channels() < 4) {
Mat a = Mat.ones(in2.size(), CvType.CV_8UC1);
a.convertTo(a, a.type(), 128);
Mat ddd = new Mat(in2.size(), CvType.CV_8UC4);
Core.merge(Arrays.asList(in2, a), ddd);
Imgcodecs.imwrite("D://result//201508030116541673X5.png", ddd);
}
通道变换和矩阵维娄变换
data:[ 1, 2, 3, 4;
5, 10, 10, 8;
9, 10, 10, 12;
13, 14, 15, 16]
4X4矩阵转为1行N列
Mat data = new Mat(4, 4, CvType.CV_8UC1);
data.put(0, 0, new byte[]{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16});
System.out.println("data:"+data.dump());
System.out.println("行数:"+data.rows());
System.out.println("列数:"+data.cols());
System.out.println("通道数:"+data.channels());
Mat dst = data.reshape(0, 1);
System.out.println("dst:"+dst.dump());
System.out.println("行数:"+dst.rows());
System.out.println("列数:"+dst.cols());
System.out.println("通道数:"+dst.channels());
dst:[ 1, 2, 3, 4, 5, 10, 10, 8, 9, 10, 10, 12, 13, 14, 15, 16]
转为1列N行
Mat dst1 = data.reshape(0, data.rows()*data.cols());
System.out.println("dst1:"+dst1.dump());
System.out.println("行数:"+dst1.rows());
System.out.println("列数:"+dst1.cols());
System.out.println("通道数:"+dst1.channels());
dst1:[ 1;
2;
3;
4;
5;
10;
10;
8;
9;
10;
10;
12;
13;
14;
15;
16]
//2通道 半宽
Mat dst2 = data.reshape(2, 0);
System.out.println("dst2:"+dst2.dump());
System.out.println("行数:"+dst2.rows());
System.out.println("列数:"+dst2.cols());
System.out.println("通道数:"+dst2.channels());
//2通道,半高
Mat dst3 = data.reshape(2, data.rows()/2);
System.out.println("dst3:"+dst3.dump());
System.out.println("行数:"+dst3.rows());
System.out.println("列数:"+dst3.cols());
System.out.println("通道数:"+dst3.channels());
获取子短阵修改后拷贝回去
Mat s = data.submat(1, 3, 1, 3);
s.setTo(new Scalar(10));
dst2:[ 1, 2, 3, 4;
5, 10, 10, 8;
9, 10, 10, 12;
13, 14, 15, 16]
矩阵运算
Core.subtract(temp1, image, temp22);
Core.add(temp22, new Scalar(128,128, 128, 128), temp2);
temp3.convertTo(temp44, temp3.type(), 2, -255);
Core.addWeighted(image, p, temp4, 1-p, 0.0, dst);
参考:
http://blog.csdn.net/wyb19890515/article/details/7284405
http://blog.csdn.net/zssureqh/article/details/7599508