-
Notifications
You must be signed in to change notification settings - Fork 14
/
OpenCVConverter.kt
55 lines (41 loc) · 1.81 KB
/
OpenCVConverter.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package ru.gordinmitya.yuv2buf_demo
import android.graphics.Bitmap
import android.graphics.ImageFormat
import androidx.camera.core.ImageProxy
import org.opencv.android.Utils
import org.opencv.core.Core
import org.opencv.core.CvType
import org.opencv.core.Mat
import org.opencv.imgproc.Imgproc
import ru.gordinmitya.yuv2buf.Yuv
import java.nio.ByteBuffer
class OpenCVConverter() : ImageConverter {
override fun getName(): String = "OpenCV (RGB rotate)"
private var reuseBuffer: ByteBuffer? = null
override fun convert(image: ImageProxy): ConversionResult {
val tik = System.currentTimeMillis()
val converted = Yuv.toBuffer(image, reuseBuffer)
reuseBuffer = converted.buffer
val format = when (converted.type) {
ImageFormat.YUV_420_888 -> Imgproc.COLOR_YUV2RGB_I420
ImageFormat.NV21 -> Imgproc.COLOR_YUV2RGB_NV21
else -> throw IllegalArgumentException()
}
val yuvMat =
Mat(image.height + image.height / 2, image.width, CvType.CV_8UC1, converted.buffer)
val rgbMat = Mat(image.height, image.width, CvType.CV_8UC3)
Imgproc.cvtColor(yuvMat, rgbMat, format)
val tokColor = System.currentTimeMillis()
if (image.imageInfo.rotationDegrees != 0) {
Core.rotate(rgbMat, rgbMat, image.imageInfo.rotationDegrees / 90 - 1)
}
val tokRotate = System.currentTimeMillis()
val bitmap = Bitmap.createBitmap(rgbMat.cols(), rgbMat.rows(), Bitmap.Config.ARGB_8888)
Utils.matToBitmap(rgbMat, bitmap)
// don't forget to call image.close() here
// but as long as we have many converters
// we'll do it in CompositeConverter
// image.close()
return ConversionResult.Success(getName(), bitmap, tokColor - tik, tokRotate - tokColor)
}
}