使用OpenCV将多张图像合并为一张图像

时间:2020-10-12 13:52:32

标签: java opencv kotlin

我尝试了很多搜索,但似乎无法弄清楚。我阅读的所有线程都表明每个人都在做同一件事。但这似乎对我不起作用。

我要创建一个新图像并将两个图像添加到此创建的图像中。

  • 为此,我正在生成一个Mat.zeros,将在其中添加我的两个图像(让我们说A和B。我将零称为Mat G)。

  • 我按比例缩小图像A和B。

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

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

  • 当我最终保存G时,得到的只是一张黑色图像(因为我将G生成为Mat.zeros) 。我猜测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)
    }

1 个答案:

答案 0 :(得分:0)

好的,问题出在我创建的空白图像(即frameOutput)中的频道上。所有输入都有3个通道,而这个矩阵只有1个通道,因为我没有正确初始化它。

更换 val frameOutput = Mat.zeros(1920, 1080, frameLeft.depth())val frameOutput = Mat.zeros(Size(1920.0, 1080.0), CvType.CV_8UC3)一起工作。