我尝试了很多搜索,但似乎无法弄清楚。我阅读的所有线程都表明每个人都在做同一件事。但这似乎对我不起作用。
我要创建一个新图像并将两个图像添加到此创建的图像中。
为此,我正在生成一个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)
}
答案 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)
一起工作。