openCV实现滤方法和摄像头采集格式处理

5 篇文章 0 订阅
5 篇文章 0 订阅
implementation("org.opencv:opencv:4.10.0-kleidicv")
package com.example.myapplication

import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Color
import android.os.Bundle
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
import com.example.myapplication.databinding.TestOpencvDemoBinding
import org.opencv.android.OpenCVLoader
import org.opencv.android.Utils
import org.opencv.core.Core
import org.opencv.core.Mat
import org.opencv.core.Size
import org.opencv.imgproc.Imgproc
import kotlin.math.abs
import kotlin.math.min


class OpenCVDemo : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val inflate = TestOpencvDemoBinding.inflate(layoutInflater)
        OpenCVLoader.initLocal()
        setContentView(inflate.root)
        inflate.btn1.setOnClickListener {
//            dealPIc2(inflate.ivYt)
            val photo = BitmapFactory.decodeResource(resources, R.drawable.zc)

            inflate.ivYt.setImageBitmap(FuDiao(photo))
        }
    }

    private fun dealPIc(imageView: ImageView) {
        val mat = Mat()
        val photo = BitmapFactory.decodeResource(resources, R.drawable.zc)
        val createBitmap =
            Bitmap.createBitmap(photo.width, photo.height, Bitmap.Config.ARGB_8888);
        Utils.bitmapToMat(photo, mat);
        Imgproc.cvtColor(mat, mat, Imgproc.COLOR_RGB2GRAY);
        Core.bitwise_not(mat, mat);
        Imgproc.threshold(mat, mat, 100.0, 255.0, Imgproc.THRESH_BINARY_INV);
        Utils.matToBitmap(mat, createBitmap);
        imageView.setImageBitmap(createBitmap)

    }

    private fun dealPIc2(imageView: ImageView) {
        val mat = Mat()
        val photo = BitmapFactory.decodeResource(resources, R.drawable.zc)
        val createBitmap =
            Bitmap.createBitmap(photo.width, photo.height, Bitmap.Config.RGB_565);
        Utils.bitmapToMat(photo, mat);
        Imgproc.cvtColor(mat, mat, Imgproc.COLOR_RGB2GRAY);
        Core.bitwise_not(mat, mat);
        Imgproc.threshold(mat, mat, 100.0, 255.0, Imgproc.THRESH_BINARY_INV);
        Utils.matToBitmap(mat, createBitmap);
        imageView.setImageBitmap(createBitmap)

    }

    //灰度化方法
    private fun RGB2Gray(photo: Bitmap): Bitmap {
        val RGBMat = Mat()
        val grayBitmap =
            Bitmap.createBitmap(photo.getWidth(), photo.getHeight(), Bitmap.Config.RGB_565)
        Utils.bitmapToMat(photo, RGBMat) //convert original bitmap to Mat, R G B.
        Imgproc.cvtColor(RGBMat, RGBMat, Imgproc.COLOR_RGB2GRAY) //rgbMat to gray grayMat
        Utils.matToBitmap(RGBMat, grayBitmap)
        return grayBitmap
    }

    //二值化滤镜
    private fun theshold(photo: Bitmap): Bitmap {
        val mat = Mat()
        val thes = Bitmap.createBitmap(photo.getWidth(), photo.getHeight(), Bitmap.Config.ARGB_8888)
        Utils.bitmapToMat(photo, mat)
        Imgproc.cvtColor(mat, mat, Imgproc.COLOR_RGB2GRAY)
        Core.bitwise_not(mat, mat)
        Imgproc.threshold(mat, mat, 100.0, 255.0, Imgproc.THRESH_BINARY_INV)
        Utils.matToBitmap(mat, thes)
        return thes
    }


    //轮廓  边沿轮廓检测
    private fun Lunkuo(photo: Bitmap): Bitmap {
        val mat = Mat()
        val Cmat = Mat()
        val Bmat = Mat()
        val cartton =
            Bitmap.createBitmap(photo.getWidth(), photo.getHeight(), Bitmap.Config.ARGB_8888)
        Utils.bitmapToMat(photo, mat)
        Imgproc.Canny(mat, Cmat, 50.0, 100.0)
        Core.bitwise_not(Cmat, Cmat)
        Utils.matToBitmap(Cmat, cartton)
        return cartton
    }


    //素描滤镜
    fun SuMiao(photo: Bitmap): Bitmap {
        val SM = Mat()
        val SM1 = Mat()
        val sumiaoMap =
            Bitmap.createBitmap(photo.getWidth(), photo.getHeight(), Bitmap.Config.ARGB_8888)
        val SMB = Bitmap.createBitmap(photo.getWidth(), photo.getHeight(), Bitmap.Config.ARGB_8888)
        val SMB1 = Bitmap.createBitmap(photo.getWidth(), photo.getHeight(), Bitmap.Config.ARGB_8888)
        Utils.bitmapToMat(photo, SM)
        //灰度化
        Imgproc.cvtColor(SM, SM, Imgproc.COLOR_RGB2GRAY)
        //颜色取反
        Core.bitwise_not(SM, SM1)
        //高斯模糊
        Imgproc.GaussianBlur(SM1, SM1, Size(13.00, 13.00), 0.0, 0.0)
        Utils.matToBitmap(SM, SMB)
        Utils.matToBitmap(SM1, SMB1)
        for (i in 0 until SMB.getWidth()) {
            for (j in 0 until SMB.getHeight()) {
                val A = SMB.getPixel(i, j)
                val B = SMB1.getPixel(i, j)
                val CR = colordodge(Color.red(A), Color.red(B))
                val CG = colordodge(Color.green(A), Color.red(B))
                val CB = colordodge(Color.blue(A), Color.blue(B))
                sumiaoMap.setPixel(i, j, Color.rgb(CR, CG, CB))
            }
        }
        return sumiaoMap
    }

    private fun colordodge(A: Int, B: Int): Int {
        return min((A + A * B / (255 - B + 1)).toDouble(), 255.0).toInt()
    }


    //怀旧色滤镜
    private fun HuaiJiu(photo: Bitmap): Bitmap {
        val huaijiu =
            Bitmap.createBitmap(photo.getWidth(), photo.getHeight(), Bitmap.Config.ARGB_8888)
        for (i in 0 until photo.getWidth()) {
            for (j in 0 until photo.getHeight()) {
                val A = photo.getPixel(i, j)
                var AR =
                    (0.393 * Color.red(A) + 0.769 * Color.green(A) + 0.189 * Color.blue(A)).toInt()
                var AG =
                    (0.349 * Color.red(A) + 0.686 * Color.green(A) + 0.168 * Color.blue(A)).toInt()
                var AB =
                    (0.272 * Color.red(A) + 0.534 * Color.green(A) + 0.131 * Color.blue(A)).toInt()
                AR = if (AR > 255) 255 else AR
                AG = if (AG > 255) 255 else AG
                AB = if (AB > 255) 255 else AB
                huaijiu.setPixel(i, j, Color.rgb(AR, AG, AB))
            }
        }
        return huaijiu
    }


    //连环画
    private fun LianHuanHua(photo: Bitmap): Bitmap {
        val lianhuanhua =
            Bitmap.createBitmap(photo.getWidth(), photo.getHeight(), Bitmap.Config.ARGB_8888)
        for (i in 0 until photo.getWidth()) {
            for (j in 0 until photo.getHeight()) {
                val A = photo.getPixel(i, j)
                var AR =
                    (abs((Color.red(A) - Color.blue(A) + Color.green(A) + Color.green(A)).toDouble()) * Color.red(
                        A
                    ) / 256).toInt()
                var AG =
                    (abs((Color.red(A) - Color.green(A) + Color.blue(A) + Color.blue(A)).toDouble()) * Color.red(
                        A
                    ) / 256).toInt()
                var AB =
                    (abs((Color.red(A) - Color.blue(A) + Color.blue(A) + Color.blue(A)).toDouble()) * Color.green(
                        A
                    ) / 256).toInt()
                AR = if (AR > 255) 255 else AR
                AG = if (AG > 255) 255 else AG
                AB = if (AB > 255) 255 else AB
                lianhuanhua.setPixel(i, j, Color.rgb(AR, AG, AB))
            }
        }
        return lianhuanhua
    }


    //冰冻滤镜
    private fun BingDong(photo: Bitmap): Bitmap {
        val bingdong =
            Bitmap.createBitmap(photo.getWidth(), photo.getHeight(), Bitmap.Config.ARGB_8888)
        for (i in 0 until photo.getWidth()) {
            for (j in 0 until photo.getHeight()) {
                val A = photo.getPixel(i, j)
                var AR = (Color.red(A) - Color.blue(A) - Color.green(A)) * 3 / 2
                var AG = (Color.green(A) - Color.blue(A) - Color.red(A)) * 3 / 2
                var AB = (Color.blue(A) - Color.red(A) - Color.green(A)) * 3 / 2
                AR = if (AR > 255) 255 else AR
                AG = if (AG > 255) 255 else AG
                AB = if (AB > 255) 255 else AB
                bingdong.setPixel(i, j, Color.rgb(AR, AG, AB))
            }
        }
        return bingdong
    }


    //熔铸滤镜
    private fun RongZhu(photo: Bitmap): Bitmap {
        val rongzhu =
            Bitmap.createBitmap(photo.getWidth(), photo.getHeight(), Bitmap.Config.ARGB_8888)
        for (i in 0 until photo.getWidth()) {
            for (j in 0 until photo.getHeight()) {
                val A = photo.getPixel(i, j)
                var AR = Color.red(A) * 128 / (Color.blue(A) + Color.green(A) + 1)
                var AG = Color.green(A) * 128 / (Color.blue(A) + Color.red(A) + 1)
                var AB = Color.blue(A) * 128 / (Color.red(A) + Color.green(A) + 1)
                AR = if (AR > 255) 255 else AR
                AG = if (AG > 255) 255 else AG
                AB = if (AB > 255) 255 else AB
                rongzhu.setPixel(i, j, Color.rgb(AR, AG, AB))
            }
        }
        return rongzhu
    }


    //浮雕滤镜
    private fun FuDiao(photo: Bitmap): Bitmap {
        val bingdong =
            Bitmap.createBitmap(photo.getWidth(), photo.getHeight(), Bitmap.Config.ARGB_8888)
        for (i in 1 until photo.getWidth() - 1) {
            for (j in 1 until photo.getHeight() - 1) {
                val A = photo.getPixel(i - 1, j - 1)
                val B = photo.getPixel(i + 1, j + 1)
                var AR = Color.red(B) - Color.red(A) + 128
                var AG = Color.green(B) - Color.green(A) + 128
                var AB = Color.blue(B) - Color.blue(A) + 128
                AR = if (AR > 255) 255 else AR
                AG = if (AG > 255) 255 else AG
                AB = if (AB > 255) 255 else AB
                bingdong.setPixel(i, j, Color.rgb(AR, AG, AB))
            }
        }
        return bingdong
    }
}

格式处理摄像头采集相关

package com.example.myapplication

import android.os.Bundle
import android.util.Log
import android.view.View
import android.view.WindowManager
import android.widget.Toast
import org.opencv.android.CameraActivity
import org.opencv.android.CameraBridgeViewBase
import org.opencv.android.CameraBridgeViewBase.CAMERA_ID_FRONT
import org.opencv.android.OpenCVLoader
import org.opencv.core.CvType
import org.opencv.core.Mat
import org.opencv.core.MatOfFloat
import org.opencv.core.MatOfInt
import org.opencv.core.Point
import org.opencv.core.Scalar
import org.opencv.core.Size

class OpenCVTest : CameraActivity(), CameraBridgeViewBase.CvCameraViewListener2 {
    private lateinit var mOpenCvCameraView: CameraBridgeViewBase
    private var mIntermediateMat: Mat? = null
    private var mSize0: Size? = null
    private lateinit var mChannels: Array<MatOfInt>
    private lateinit var mBuff: FloatArray
    private val mHistSizeNum = 25
    private var mHistSize: MatOfInt? = null
    private var mRanges: MatOfFloat? = null
    private var mMat0: Mat? = null
    private lateinit var mColorsRGB: Array<Scalar>
    private lateinit var mColorsHue: Array<Scalar>
    private var mWhilte: Scalar? = null
    private var mP1: Point? = null
    private var mP2: Point? = null
    private var mSepiaKernel: Mat? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.test_opencv)
        if (OpenCVLoader.initLocal()) {
            Log.i(
                "gsc",
                "OpenCV loaded successfully"
            )
        } else {
            Log.e(
                "gsc",
                "OpenCV initialization failed!"
            )
            Toast.makeText(this, "OpenCV initialization failed!", Toast.LENGTH_LONG).show()
            return
        }

        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
        mOpenCvCameraView =
            findViewById<View>(R.id.image_manipulations_activity_surface_view) as CameraBridgeViewBase

        mOpenCvCameraView.setCameraIndex(CAMERA_ID_FRONT)

        mOpenCvCameraView.SetCaptureFormat(CameraBridgeViewBase.GRAY)
        mOpenCvCameraView.setVisibility(CameraBridgeViewBase.VISIBLE)
        mOpenCvCameraView.setCvCameraViewListener(this@OpenCVTest)
    }

    override fun onCameraViewStarted(width: Int, height: Int) {
        mIntermediateMat = Mat()
        mSize0 = Size()
        mChannels = arrayOf(MatOfInt(0), MatOfInt(1), MatOfInt(2))
        mBuff = FloatArray(mHistSizeNum)
        mHistSize = MatOfInt(mHistSizeNum)
        mRanges = MatOfFloat(0f, 256f)
        mMat0 = Mat()
        mColorsRGB = arrayOf(
            Scalar(200.0, 0.0, 0.0, 255.0),
            Scalar(0.0, 200.0, 0.0, 255.0),
            Scalar(0.0, 0.0, 200.0, 255.0)
        )
        mColorsHue = arrayOf(
            Scalar(255.0, 0.0, 0.0, 255.0),
            Scalar(255.0, 60.0, 0.0, 255.0),
            Scalar(255.0, 120.0, 0.0, 255.0),
            Scalar(255.0, 180.0, 0.0, 255.0),
            Scalar(255.0, 240.0, 0.0, 255.0),
            Scalar(215.0, 213.0, 0.0, 255.0),
            Scalar(150.0, 255.0, 0.0, 255.0),
            Scalar(85.0, 255.0, 0.0, 255.0),
            Scalar(20.0, 255.0, 0.0, 255.0),
            Scalar(0.0, 255.0, 30.0, 255.0),
            Scalar(0.0, 255.0, 85.0, 255.0),
            Scalar(0.0, 255.0, 150.0, 255.0),
            Scalar(0.0, 255.0, 215.0, 255.0),
            Scalar(0.0, 234.0, 255.0, 255.0),
            Scalar(0.0, 170.0, 255.0, 255.0),
            Scalar(0.0, 120.0, 255.0, 255.0),
            Scalar(0.0, 60.0, 255.0, 255.0),
            Scalar(0.0, 0.0, 255.0, 255.0),
            Scalar(64.0, 0.0, 255.0, 255.0),
            Scalar(120.0, 0.0, 255.0, 255.0),
            Scalar(180.0, 0.0, 255.0, 255.0),
            Scalar(255.0, 0.0, 255.0, 255.0),
            Scalar(255.0, 0.0, 215.0, 255.0),
            Scalar(255.0, 0.0, 85.0, 255.0),
            Scalar(255.0, 0.0, 0.0, 255.0)
        )
        mWhilte = Scalar.all(255.0)
        mP1 = Point()
        mP2 = Point()

        // Fill sepia kernel

        // Fill sepia kernel
        mSepiaKernel = Mat(4, 4, CvType.CV_32F)
        mSepiaKernel!!.put(0, 0,  /* R */0.189, 0.769, 0.393, 0.0)
        mSepiaKernel!!.put(1, 0,  /* G */0.168, 0.686, 0.349, 0.0)
        mSepiaKernel!!.put(2, 0,  /* B */0.131, 0.534, 0.272, 0.0)
        mSepiaKernel!!.put(3, 0,  /* A */0.000, 0.000, 0.000, 1.0)
    }

    override fun getCameraViewList(): List<CameraBridgeViewBase> {
        return listOf(mOpenCvCameraView)
    }

    override fun onCameraViewStopped() {
        // Explicitly deallocate Mats
        // Explicitly deallocate Mats
        if (mIntermediateMat != null) mIntermediateMat!!.release()
        mIntermediateMat = null
    }

    override fun onCameraFrame(inputFrame: CameraBridgeViewBase.CvCameraViewFrame?): Mat {
        val rgba = inputFrame!!.gray()
        val sizeRgba = rgba.size()
        return rgba


    }

    override fun onPause() {
        super.onPause()
        mOpenCvCameraView.disableView()
    }

    override fun onResume() {
        super.onResume()
        mOpenCvCameraView.enableView()
    }

    override fun onDestroy() {
        super.onDestroy()
        mOpenCvCameraView.disableView()

    }
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <org.opencv.android.JavaCameraView
        android:layout_width="fill_parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        android:layout_height="fill_parent"
        android:id="@+id/image_manipulations_activity_surface_view" />
</androidx.constraintlayout.widget.ConstraintLayout>
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江南一舟110

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值