Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何通过OpenCV实现无缝克隆?_Android_Opencv_Opencv4android - Fatal编程技术网

Android 如何通过OpenCV实现无缝克隆?

Android 如何通过OpenCV实现无缝克隆?,android,opencv,opencv4android,Android,Opencv,Opencv4android,我想在Android上使用opencv来实现SeamlesClone,因为我没有opencv的经验,调试的结果不是我所期望的(我在python上得到了正确的结果,但Android是完全错误的)。下面是我的代码,你能给我一些线索吗,或者android上的示例代码?谢谢 fun compound(originBm: Bitmap, dstBm: Bitmap, maskBm: Bitmap): Bitmap? { var matSrc = Mat()

我想在Android上使用opencv来实现SeamlesClone,因为我没有opencv的经验,调试的结果不是我所期望的(我在python上得到了正确的结果,但Android是完全错误的)。下面是我的代码,你能给我一些线索吗,或者android上的示例代码?谢谢

fun compound(originBm: Bitmap, dstBm: Bitmap, maskBm: Bitmap): Bitmap? {
            var matSrc = Mat()
            Utils.bitmapToMat(originBm, matSrc)
            var matDst = Mat()
            Utils.bitmapToMat(dstBm, matDst)
            var matMask = Mat()
            Utils.bitmapToMat(maskBm, matMask)
            cvtColor(matMask, matMask, COLOR_RGBA2GRAY, 1)
            var point = Point(matDst.cols() / 2.0, matDst.rows() / 2.0)
            val matBlend = Mat.zeros(matDst.size(), matDst.type())
            seamlessClone(matSrc, matDst, matMask, point, matBlend, MIXED_CLONE)
            var bitmap = createBitmap(matBlend.cols(), matBlend.rows(), ARGB_8888)
            Utils.matToBitmap(matBlend, bitmap)
            return bitmap
        }
1024是调试窗口的最大高度,因此窗口的右上角不是真正的宽度和高度。

原始BM(1200px*1200px):DstBm(2960*3946): MaskBm(1200*1200):,结果tbm: 无论我如何修改maskbm并向其添加一些黑色区域,生成的图形看起来像是被高斯模糊了。我的OpenCV sdk来自:OpenCV-4.1.0-android-sdk.zip。 我在我的第一个活动中初始化opencv:

private val mLoaderCallback = object : BaseLoaderCallback(this) {
        override fun onManagerConnected(status: Int) {
            when (status) {
                LoaderCallbackInterface.SUCCESS -> {ToastUtils.showShort("OpenCV loaded successfully")}
                else -> {super.onManagerConnected(status)}
            }
        }
    }

    override fun onResume() {
        super.onResume()
        if (!OpenCVLoader.initDebug()) {
            println("Internal OpenCV library not found. Using OpenCV Manager for initialization")
            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback)
        } else {
            println("OpenCV library found inside package. Using it!")
            mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS)
        }
    }
通过上面的代码转换,结果现在是正确的

var matSrc = Mat()
Utils.bitmapToMat(originBm, matSrc)
cvtColor(matSrc, matSrc, COLOR_RGBA2RGB, 3)//make ARGB bitmap to RGB Mat
dst also need covert.