Android OpenCV(四十一),“金三银四”春招指南

FLOODFILL_FIXED_RANGE:如果设置为这个标识符,就会考虑当前像素与种子之间的差,否则就考虑当前像素与其邻域像素的差。

FLOODFILL_MASK_ONLY,如果设置为这个标识符,函数不会去填充改变原始图像,而是去填充掩膜图像。也就是忽略第三个参数newVal

// C++: enum FloodFillFlags
public static final int
FLOODFILL_FIXED_RANGE = 1 << 16,
FLOODFILL_MASK_ONLY = 1 << 17;

所以, flag 可以用 按位或,即‘|’ 连接起来。例如想用 4 邻域填充,并填充固定像素范围,填充掩码而不是填充原图,以及设置填充值为 250,那么输入的参数为

4 or (250 shl 8) or Imgproc.FLOODFILL_FIXED_RANGE or Imgproc.FLOODFILL_MASK_ONLY

操作

/**

  • 图像分割–漫水填充法
  • author: yidong
  • 2020/11/7
    */
    class FloodFillActivity : AppCompatActivity() {
    private val mBinding by lazy { ActivityFloodFillBinding.inflate(layoutInflater) }
    private lateinit var mMenuDialog: BottomSheetDialog
    private lateinit var mMenuDialogBinding: LayoutFloodFillMenuBinding

private var mConnectionType = 4
private var mFloodFillFlag = 0
private var mScalarNumber = 250 shl 8

private lateinit var mRgb: Mat
private var loDiff = 0.0
set(value) {
field = value
doFloodFill()
}
private var upDiff = 0.0
set(value) {
field = value
doFloodFill()
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(mBinding.root)
val bgr = Utils.loadResource(this, R.drawable.wedding)
mRgb = Mat()
Imgproc.cvtColor(bgr, mRgb, Imgproc.COLOR_BGR2RGB)
mBinding.ivLena.showMat(mRgb)
mBinding.sbLow.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(p0: SeekBar?, p1: Int, p2: Boolean) {
mBinding.tvLoDiff.text = p1.toString()
loDiff = p1.toDouble()
}

override fun onStartTrackingTouch(p0: SeekBar?) {
}

override fun onStopTrackingTouch(p0: SeekBar?) {
}

})
mBinding.sbUp.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(p0: SeekBar?, p1: Int, p2: Boolean) {
mBinding.tvUpDiff.text = p1.toString()
upDiff = p1.toDouble()
}

override fun onStartTrackingTouch
(p0: SeekBar?) {
}

override fun onStopTrackingTouch(p0: SeekBar?) {
}

})
mBinding.btFlag.setOnClickListener {
showMenuDialog()
}
doFloodFill()
}

private fun doFloodFill() {
val tmp = mRgb.clone()
val maskers = Mat(mRgb.rows() + 2, mRgb.cols() + 2, CV_8UC1, Scalar.all(0.0))
Imgproc.floodFill(
tmp,
maskers,
Point(7.0, 7.0),
Scalar(65.0, 105.0, 225.0),
Rect(),
Scalar.all(loDiff),
Scalar.all(upDiff),
mConnectionType or mFloodFillFlag or mScalarNumber
)
if (mFloodFillFlag and Imgproc.FLOODFILL_MASK_ONLY == Imgproc.FLOODFILL_MASK_ONLY) {
mBinding.ivResult.showMat(maskers)
} else {
mBinding.ivResult.showMat(tmp)
}

tmp.release()
maskers.release()
}

private fun showMenuDialog() {
if (!this::mMenuDialog.isInitialized) {
mMenuDialog = BottomSheetDialog(this)
mMenuDialogBinding = LayoutFloodFillMenuBinding.inflate(layoutInflater)
mMenuDialog.setContentView(mMenuDialogBinding.root)
mMenuDialog.setOnDismissListener {
mConnectionType =
if (mMenuDialogBinding.rgFirst.checkedRadioButtonId == R.id.rb_8) {
8
} else {
4
}
mFloodFillFlag = if (mMenuDialogBinding.cbFixed.isChecked) {
mFloodFillFlag or Imgproc.FLOODFILL_FIXED_RANGE
} else {
mFloodFillFlag and Imgproc.FLOODFILL_FIXED_RANGE.inv()
}
mFloodFillFlag = if (mMenuDialogBinding.cbMaskOnly.isChecked) {
mFloodFillFlag or Imgproc.FLOODFILL_MASK_ONLY
} else {
mFloodFillFlag and Imgproc.FLOODFILL_MASK_ONLY.inv()
}
try {
mScalarNumber = mMenuDialogBinding.etScalar.text.toString().toInt(10) shl 8
} catch (e: NumberFormatException) {
e.printStackTrace()
}
doFloodFill()
}
}
mMenuDialog.show()
}

lar.text.toString().toInt(10) shl 8
} catch (e: NumberFormatException) {
e.printStackTrace()
}
doFloodFill()
}
}
mMenuDialog.show()
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值