Java 使用OpenCV将多个图像合并为一个图像
我试着寻找这个相当多,似乎无法找到它。我读到的所有帖子都表明每个人都在做同样的事情。但这似乎对我不起作用 我想创建一个新图像,并在此创建的图像中添加两个图像Java 使用OpenCV将多个图像合并为一个图像,java,opencv,kotlin,Java,Opencv,Kotlin,我试着寻找这个相当多,似乎无法找到它。我读到的所有帖子都表明每个人都在做同样的事情。但这似乎对我不起作用 我想创建一个新图像,并在此创建的图像中添加两个图像 为此,我将生成一个Mat.zeros,我将在其上添加我的两个图像(假设a和B。我将称为zeros Mat G) 我缩小了图像A和B的比例 我在G上创建一个大小为A的ROI,然后将A复制到G.submat 我在G上创建一个大小为B的ROT,然后将B复制到G.submat 当我最终保存G时,我得到的只是一个黑色图像(因为我将G生成为M
- 为此,我将生成一个
,我将在其上添加我的两个图像(假设a和B。我将称为zeros Mat G)Mat.zeros
- 我缩小了图像A和B的比例
- 我在G上创建一个大小为A的ROI,然后将A复制到
G.submat
- 我在G上创建一个大小为B的ROT,然后将B复制到
G.submat
- 当我最终保存G时,我得到的只是一个黑色图像(因为我将G生成为
) . 我猜Mat.zero
并不是真的在G的ROI上将内容从A复制到GcopyTo
@PostConstruct
fun init() {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
@Test
fun `merge image`() {
val frameLeft = Imgcodecs.imread("/home/nischit/Downloads/potato1.jpg")
val frameRight = Imgcodecs.imread("/home/nischit/Downloads/potato2.jpg")
val frameOutput = Mat.zeros(1920, 1080, frameLeft.depth())
println(frameLeft.depth())
println(frameRight.depth())
println(frameOutput.depth())
val tempLeft = Mat()
val tempRight = Mat()
scaleFrame(frameLeft, tempLeft)
scaleFrame(frameRight, tempRight)
println("tempLeft: ${tempLeft.cols()},${tempLeft.rows()}")
println("tempRight: ${tempRight.cols()},${tempRight.rows()}")
tempLeft.copyTo(frameOutput.submat(Rect(10, 10, tempLeft.cols(), tempLeft.rows())))
tempRight.copyTo(frameOutput.submat(Rect(10, 500, tempRight.cols(), tempRight.rows())))
saveImage(frameOutput, 2)
}
fun scaleFrame(frame: Mat, out: Mat, maxWidth: Int = MAX_WIDTH, maxHeight: Int = MAX_HEIGHT) {
val isFrameInPortraitMode = frame.height() > frame.width()
val scale = if (isFrameInPortraitMode) {
(maxHeight * 1.0 / frame.height())
} else {
(maxWidth * 1.0 / frame.width())
}
Imgproc.resize(frame, out, Size(frame.width() * scale, frame.height() * scale))
}
fun saveImage(frame: Mat, i: Int = 0) {
Imgcodecs.imwrite("/home/nischit/Downloads/potatoGenerated$i.jpg", frame)
}
问题是,在我创建的空白图像中有通道,即<代码>框架输出< /代码>。所有输入都有3个通道,而这个矩阵有1个通道,因为我没有正确初始化它 替换
val frameOutput=Mat.zero(1920,1080,frameLeft.depth())
与val frameOutput=Mat.zero(Size(1920.0,1080.0),CvType.CV_8UC3)一起工作。