一、通过多个子矩阵生成一个完整的矩阵
在OpenCV中两个非常重要的函数:setTo和copyTo。setTo可以将一个矩阵中的所有像素设置为指定的颜色,而copyTo可以将一个已有的矩阵复制到另一个矩阵之中。当使用setTo或者copyTo时,你经常需要与子矩阵打交道,即只对矩阵中的一部分进行处理。为了使用setTo,我们会用到OpenCV的Scalar对象来定义颜色,这里会使用RGB颜色空间的一组值来创建。
首先我们通过RGB值来定义颜色。之前提到过,颜色是通过Scalar对象创建出来的,包含三个整数值,每个值的范围是0~255。
第一个颜色值代表蓝色的深度,第二个值代表绿色的深度,最后一个值代表红色的深度。为了得到红色、绿色或者蓝色,可以把对应的颜色值设为最高值,即255,其他值设为0。
1. 第一个例子通过使用 setTo() 将多个子矩阵合成一个矩阵,每个子矩阵有不同的颜色。
通过 Scalar对象 获得到红色、绿色和蓝色。代码实现:
// 定义获取 红绿蓝 三色
Scalar scalarRed = new Scalar(0,0,255);
Scalar scalarGreen = new Scalar(0,255,0);
Scalar scalarBlue = new Scalar(255,0,0);
接下来,定义蓝绿色、品红色和黄色,我们把这些颜色当作RGB的补充色。因此把其他通道设置为最大值255,主通道设置为0。蓝绿色是红色的补充色,所以红色值通道被设为0,而另外两个通道为255;代码实现:
Scalar CYAN = new Scalar(255,255,0);
// 品红是绿色的补充色,黄色是蓝色的补充色,它们的值如下所示:
Scalar MAGENTA = new Scalar(255,0,255);
Scalar YELLOW = new Scalar(0,255,255);
2. 通过使用setTo将子矩阵设置为给定的Scalar颜色。
此处暂无代码实现..... 后续更新
二、从图片子矩阵生成矩阵
首先创建一个大小为200×200的矩阵和两个子矩阵:一个是主矩阵的上部,一个是主矩阵的下部。
int width = 200 ,heigth = 200 ;
Mat mat = new Mat(heigth,width,CvType.CV_8UC3);
Mat top = mat.submat(0,heigth/2,0,width);
Mat bottom = mat.submat(heigth/2,heigth,0,width);
然后加载一个图片以创建另一个小矩阵,并把它的大小调整为上部(或下部)的子矩阵大小。这里会引入Imgproc类中的resize函数。
Mat small = Imgcodecs.imread("D:\\ProgramFiles\\personDocument\\picture\\888.png");
Imgproc.resize(small,small,top.size());
imwrite("D:\\ProgramFiles\\personDocument\\picture\\3.png", small);
之前设置大小的步骤很关键。复制能够成功,是因为小矩阵和子矩阵的大小是完全相同的,因此复制的时候没有出现任何问题。代码实现:
@Test
public void test15() throws Exception {
URL url = ClassLoader.getSystemResource("lib/opencv_java440.dll");
System.load(url.getPath());
int width = 200 ,heigth = 200 ;
Mat mat = new Mat(heigth,width,CvType.CV_8UC3);
Mat top = mat.submat(0,heigth/2,0,width);
Mat bottom = mat.submat(heigth/2,heigth,0,width);
Mat small = Imgcodecs.imread("D:\\ProgramFiles\\personDocument\\picture\\888.png");
Imgproc.resize(small,small,top.size());
imwrite("D:\\ProgramFiles\\personDocument\\picture\\3.png", small);
small.copyTo(top);
small.copyTo(bottom);
imwrite("D:\\ProgramFiles\\personDocument\\picture\\4.png", mat);
imshow("submat Image after:", mat);
waitKey();
}
生成的 4.png 文件包含两个图片。如图:
如果你忘了调整小矩阵的大小,那么复制会彻底失败,结果可能会是如图 的样子。