OpenCV轻量高效的图像视觉库

愤怒的蜗牛

OpenCV介绍

OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。OpenCV轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV用C++语言编写,具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令,也提供对于C#、Ch、Ruby,GO的支持。

OpenCV是一个强大的计算机视觉库,它包含了大量的算法和函数,可以用于图像处理、计算机视觉、模式识别、机器学习等领域。OpenCV的应用领域非常广泛,包括机器人视觉、模式识别、机器学习、工厂自动化生产线产品检测、医学影像、摄像机标定、遥感图像等。OpenCV也可以解决人机交互、机器人视觉、运动跟踪、图像分类、人脸识别、物体识别、特征检测、视频分析、深度图像等问题。

OpenCV的底层由C和C++编写,轻量且高效,可以运行在多个操作系统上,同时提供了多种编程语言的API接口,如Python、Ruby、MATLAB等。OpenCV也支持基于CUDA和OpenCL的高速GPU操作接口。

OpenCV轻量高效的图像视觉库

OpenCV使用

(1) 「下载OpenCV SDK for Android」:从OpenCV官网下载适用于Android的OpenCV SDK。

OpenCV轻量高效的图像视觉库

(2) 「配置Android项目」:在Android Studio中,创建一个新的项目或打开一个已有的项目。将下载的OpenCV SDK作为一个Module导入到项目中。

OpenCV轻量高效的图像视觉库

android {
    compileSdkVersion 34
    //新的Android Studio需添加
    namespace "org.opencv"

    buildFeatures {
        //启用aidl
        aidl true
    }}1.2.3.4.5.6.7.8.9.10.

gradle.properties中添加:

android.defaults.buildfeatures.buildconfig=true1.

(3) 「配置项目依赖」:在项目的build.gradle文件中,添加对OpenCV SDK的依赖。

implementation project(':opencv')1.

(4) 「初始化OpenCV」:在Android应用中 始化OpenCV库。

class MainActivity : AppCompatActivity() {
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION, this, mLoaderCallbackInterface)
    }

    private val mLoaderCallbackInterface = object : LoaderCallbackInterface {
        override fun onManagerConnected(status: Int) {
            //OpenCV加载成功
        }

        override fun onPackageInstall(operation: Int, callback: InstallCallbackInterface?) {

        }
    }}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.

(5) 「使用OpenCV功能」:加载图像、显示图像、进行图像处理等。

(6) 「编译和运行」:在完成配置后,编译并运行应用以测试OpenCV功能是否正常工作。

OpenCV轻量高效的图像视觉库

OpenCV轻量高效的图像视觉库

OpenCV图片灰度处理示例:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <ImageView        android:id="@+id/iv_image"
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:scaleType="centerCrop" />

    <LinearLayout        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:orientation="horizontal">

        <Button            android:id="@+id/btn_load"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="加载图片"
            android:textSize="16sp" />

        <Button            android:id="@+id/btn_gray"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="16dp"
            android:layout_weight="1"
            android:text="图片灰度化"
            android:textSize="16sp" />
    </LinearLayout></LinearLayout>1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.
package com.reathin.countimport android.R.attr.bitmapimport android.content.Intentimport android.graphics.Bitmapimport android.graphics.BitmapFactoryimport android.os.Bundleimport android.util.Logimport androidx.appcompat.app.AppCompatActivityimport com.reathin.count.databinding.ActivityMainBindingimport org.opencv.android.InstallCallbackInterfaceimport org.opencv.android.LoaderCallbackInterfaceimport org.opencv.android.OpenCVLoaderimport org.opencv.android.Utilsimport org.opencv.core.CvTypeimport org.opencv.core.Matimport org.opencv.imgproc.Imgprocclass MainActivity : AppCompatActivity() {

    private val TAG = MainActivity::class.java.simpleName    private lateinit var mBinding: ActivityMainBinding    private var mBitmap: Bitmap? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(mBinding.root)

        //初始化OpenCV
        val initState = OpenCVLoader.initDebug(true)
        Log.d(TAG, "onCreate: OpenCV初始化$initState")

        mBinding.btnLoad.setOnClickListener {
            val intent = Intent()
            intent.setType("image/*")

            intent.setAction(Intent.ACTION_GET_CONTENT)
            startActivityForResult(intent, 20240104)
        }
        mBinding.btnGray.setOnClickListener {
            if (mBitmap == null) {
                return@setOnClickListener            }
            //进行灰度
            mBitmap?.run {
                val bitmap = Bitmap.createBitmap(this.width, this.height, Bitmap.Config.ARGB_8888)
                val srcMat = Mat()
                val dstMat = Mat()
                Utils.bitmapToMat(this, srcMat)
                Imgproc.cvtColor(srcMat, dstMat, Imgproc.COLOR_BGRA2GRAY)
                Utils.matToBitmap(dstMat, bitmap)
                runOnUiThread { mBinding.ivImage.setImageBitmap(bitmap) }
                srcMat.release()
                dstMat.release()
            }
        }

    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == 20240104 && resultCode == RESULT_OK && data != null) {
            data.data?.run {
                mBitmap = BitmapFactory.decodeStream(contentResolver.openInputStream(this))
            }
            mBitmap?.run {
                mBinding.ivImage.setImageBitmap(this)
            }
        }
    }

    private val mLoaderCallbackInterface = object : LoaderCallbackInterface {
        override fun onManagerConnected(status: Int) {
            Log.d(TAG, "onManagerConnected: $status")
            if (status == LoaderCallbackInterface.SUCCESS) {
                //OpenCV加载成功
            }
        }

        override fun onPackageInstall(operation: Int, callback: InstallCallbackInterface?) {

        }
    }} 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.87.

总结

OpenCV是一个跨平台的计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。OpenCV轻量级而且高效,由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

OpenCV的使用场景非常广泛:

  • 「医学影像分析」:OpenCV可以用于医学影像处理,如医学图像分割、医学图像配准、医学图像增强等。例如,在肺部结节检测和病理识别中,可以使用OpenCV进行图像增强、边缘检测和病变分割等操作。

  • 「智能交通系统」:在智能交通系统中,OpenCV可以用于车辆检测、车牌识别和行人跟踪等任务。例如,通过使用OpenCV,可以检测图像或视频中的车辆,对车牌进行识别,并跟踪行人的运动轨迹。

  • 「安防监控系统」:在安防监控领域,OpenCV可以用于行为识别、目标追踪和异常检测等任务。例如,通过使用OpenCV,可以识别监控视频中的异常行为,如入侵、火灾等,并及时发出警报。

  • 「机器人视觉」:在机器人视觉领域,OpenCV可以用于环境感知、手势识别和姿态估计等任务。例如,通过使用OpenCV,机器人可以识别障碍物、地标等信息,以及进行自主导航。

  • 「计算机视觉」:OpenCV可用于计算机视觉任务,如目标检测、图像分类、人脸识别、姿态估计、运动估计、光流估计等。例如,可以使用OpenCV进行人脸识别和跟踪,实现门禁系统等功能。

  • 「视频分析」:OpenCV可用于视频分析任务,如视频跟踪、行为识别、动作识别等。例如,在智能视频监控系统中,可以使用OpenCV对视频进行分析和处理,实现视频内容的理解和分析。

  • 「图像处理」:OpenCV可以实现各种图像处理功能,包括图像颜色校正、锐化和模糊等。例如,可以使用OpenCV对图像进行色彩空间转换、图像滤波等操作,改善图像质量。

  • 「图像识别」:OpenCV可以实现图像识别功能,识别图像中的字符和数字。例如,可以使用OpenCV进行车牌识别、印刷文字识别等任务。

OpenCV具有广泛的应用领域,包括图像像素操作、几何运算、逻辑运算、像素统计、色彩空间转换、卷积图像处理、形态学处理、特征提取等。它可以帮助研究人员和开发人员快速实现计算机视觉应用,提高图像处理和识别的准确率。


您需要 登录账户 后才能发表评论

发表评论

快捷回复: 表情:
AddoilApplauseBadlaughBombCoffeeFabulousFacepalmFecesFrownHeyhaInsidiousKeepFightingNoProbPigHeadShockedSinistersmileSlapSocialSweatTolaughWatermelonWittyWowYeahYellowdog
评论列表 (暂无评论,242人围观)

还没有评论,来说两句吧...

目录[+]

取消
微信二维码
微信二维码
支付宝二维码