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 {
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)
Imgproc.cvtColor(RGBMat, RGBMat, Imgproc.COLOR_RGB2GRAY)
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()
mSepiaKernel = Mat(4, 4, CvType.CV_32F)
mSepiaKernel!!.put(0, 0, 0.189, 0.769, 0.393, 0.0)
mSepiaKernel!!.put(1, 0, 0.168, 0.686, 0.349, 0.0)
mSepiaKernel!!.put(2, 0, 0.131, 0.534, 0.272, 0.0)
mSepiaKernel!!.put(3, 0, 0.000, 0.000, 0.000, 1.0)
}
override fun getCameraViewList(): List<CameraBridgeViewBase> {
return listOf(mOpenCvCameraView)
}
override fun onCameraViewStopped() {
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>