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

我试着寻找这个相当多,似乎无法找到它。我读到的所有帖子都表明每个人都在做同样的事情。但这似乎对我不起作用

我想创建一个新图像,并在此创建的图像中添加两个图像

  • 为此,我将生成一个
    Mat.zeros
    ,我将在其上添加我的两个图像(假设a和B。我将称为zeros Mat G)

  • 我缩小了图像A和B的比例

  • 我在G上创建一个大小为A的ROI,然后将A复制到
    G.submat

  • 我在G上创建一个大小为B的ROT,然后将B复制到
    G.submat

  • 当我最终保存G时,我得到的只是一个黑色图像(因为我将G生成为
    Mat.zero
    ) . 我猜
    copyTo
    并不是真的在G的ROI上将内容从A复制到G

我不确定我做错了什么

我正在使用Kotlin,它可以编译成Java

    @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)一起工作。