Я использую ручной выбор касания на экране, чтобы пользователь мог выбрать интересующую область для удаления фона. Для этого я разрабатываю приложение в Kotlin с использованием opencv. То, как вы в настоящее время выполняете это удаление, всего двумя касаниями пользователя на экране, образуя квадрат в области выбора. Это хорошо работает для небольших изображений, но для больших изображений фоновое усечение не работает хорошо. Для этого лучшим решением было бы получить эти координаты при свободном выборе изображения, где пользователь может отметить всю границу интересующей области. Может ли кто-нибудь помочь мне внести это изменение в мой код. Код ниже делает выбор изображения и обрезает заднюю часть.
КОД :
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
check(OpenCVLoader.initDebug(), { Toast.makeText(this, "OpenCV was not initialized properly", Toast.LENGTH_SHORT).show() })
rxPermissions = RxPermissions(this)
image.setOnTouchListener { _, event ->
if (!isPhotoChosen()) {
return@setOnTouchListener false
}
if (event.action == MotionEvent.ACTION_DOWN) {
val bounds = getBitmapPositionInsideImageView(image)
val xScaled = (event.x / bounds[4]) - bounds[0]
val yScaled = (event.y / bounds[5]) - bounds[1]
if (!hasChosenTopLeft()) {
coordinates.first.apply {
x = xScaled.toDouble()
y = yScaled.toDouble()
}
} else if (!hasChosenBottomRight()) {
with(Bitmap.createBitmap(bitmap.width, bitmap.height, Bitmap.Config.RGB_565)) {
coordinates.second.apply {
x = xScaled.toDouble()
y = yScaled.toDouble()
}
val rectPaint = Paint().apply {
setARGB(255, 0, 255, 0)
style = Paint.Style.STROKE
strokeWidth = 4f
}
Canvas(this).apply {
drawBitmap(bitmap, 0f, 0f, null)
drawRect(coordinates.first.x.toFloat(), coordinates.first.y.toFloat(), coordinates.second.x.toFloat(), coordinates.second.y.toFloat(), rectPaint)
}
image.setImageDrawable(BitmapDrawable(resources, this))
}
} else {
resetTarget()
}
}
true
}
}