当前位置: 首页 > news >正文

如何别人看自己做的网站企业管理软件erp

如何别人看自己做的网站,企业管理软件erp,品牌营销策划成功案例,做视频网站的公司1. 前言 上篇文章 我们已经通过一个简单的例子#xff0c;在Android Studio中接入了OpenCV。 之前我们也 在Visual Studio上#xff0c;使用OpenCV实现人脸识别 中实现了人脸识别的效果。 接着#xff0c;我们就可以将OpenCV的人脸识别效果移植到Android中了。 1.1 环境说…1. 前言 上篇文章 我们已经通过一个简单的例子在Android Studio中接入了OpenCV。 之前我们也 在Visual Studio上使用OpenCV实现人脸识别 中实现了人脸识别的效果。 接着我们就可以将OpenCV的人脸识别效果移植到Android中了。 1.1 环境说明 操作系统 : windows 10 64位Android Studio版本 : Android Studio Giraffe | 2022.3.1OpenCV版本 : OpenCV-4.8.0 (2023年7月最新版) 1.2 实现效果 先来看下实现效果识别到的人脸会用红框框出来。 接下来我们来一步步实现上述的效果。 2. 前置操作 2.1 添加权限 uses-permission android:nameandroid.permission.CAMERA / uses-permission android:nameandroid.permission.WRITE_EXTERNAL_STORAGE / uses-permission android:nameandroid.permission.RECORD_AUDIO /ActivityCompat.requestPermissions(thisFaceDetectionActivity,arrayOf(Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.RECORD_AUDIO),1 )2.2 新建FaceDetectionActivity 新建FaceDetectionActivity并将其设为默认的Activity然后修改其XML布局 ?xml version1.0 encodingutf-8? RelativeLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentxmlns:apphttp://schemas.android.com/apk/res-autoandroid:orientationverticaltools:context.MainActivityandroidx.constraintlayout.widget.ConstraintLayoutandroid:backgroundcolor/blackandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentSurfaceViewandroid:idid/surfaceViewandroid:layout_widthmatch_parentandroid:layout_height0dpapp:layout_constraintBottom_toBottomOfparentapp:layout_constraintDimensionRatiow,4:3app:layout_constraintLeft_toLeftOfparentapp:layout_constraintRight_toRightOfparentapp:layout_constraintTop_toTopOfparent //androidx.constraintlayout.widget.ConstraintLayoutLinearLayoutandroid:layout_widthmatch_parentandroid:orientationhorizontalandroid:layout_heightwrap_contentButtonandroid:text切换摄像头android:onClickswitchCameraandroid:layout_widthwrap_contentandroid:layout_heightwrap_content //LinearLayout /RelativeLayout2.3 添加JNI方法 然后修改FaceDetectionActivity为如下代码这里增加了三个JNI方法 init : 初始化OpenCV人脸识别setSurface : 设置SurfaceViewpostData : 发送视频帧数据 class FaceDetectionActivity : AppCompatActivity() {private lateinit var binding: ActivityFaceDetectionBindingoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding ActivityFaceDetectionBinding.inflate(layoutInflater)setContentView(binding.root)//这里省略了申请权限的代码...}//初始化OpenCVexternal fun init(path: String?)//向OpenCV发送一帧的图像数据external fun postData(data: ByteArray?, width: Int, height: Int, cameraId: Int)//设置SurfaceViewexternal fun setSurface(surface: Surface?)companion object {init {System.loadLibrary(myopencvtest)}} }同时需要在native-lib.cpp中添加这三个JNI方法这里的com_heiko_myopencvtest_FaceDetectionActivity需要改为你实际的包名和类名。 extern C JNIEXPORT void JNICALL Java_com_heiko_myopencvtest_FaceDetectionActivity_init(JNIEnv *env, jobject thiz, jstring path) {} extern C JNIEXPORT void JNICALL Java_com_heiko_myopencvtest_FaceDetectionActivity_postData(JNIEnv *env, jobject thiz,jbyteArray data, jint width, jint height,jint camera_id) { } extern C JNIEXPORT void JNICALL Java_com_heiko_myopencvtest_FaceDetectionActivity_setSurface(JNIEnv *env, jobject thiz,jobject surface) { }2.4 实现相机预览功能 这里用到了Camera1 API直接使用CameraHelper这个工具类接入即可这部分详见我的另一篇博客 Android 使用Camera1的工具类CameraHelper快速实现相机预览、拍照功能 override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding ActivityFaceDetectionBinding.inflate(layoutInflater)setContentView(binding.root)//这里省略了申请权限的代码...val surfaceView findViewByIdSurfaceView(R.id.surfaceView)surfaceView.holder.addCallback(this)cameraHelper CameraHelper(cameraId)cameraHelper.setPreviewCallback(this) }3. 初始化OpenCV 3.1 配置OpenCV 接着我们不要忘了配置OpenCV这部分详见我的另一篇博客 : Android Studio 接入OpenCV最简单的例子 : 实现灰度图效果 3.2 赋值级联分类器文件 配置好OpenCV我们要将模型也就是人脸识别的级联分类器文件haarcascade_frontalface_alt.xml复制到asserts文件夹下。 当我们启动App的时候需要将该文件复制到外置存储中。 override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)//省略了其他代码...//Utils类可以在本文末尾复制Utils.copyAssets(thisFaceDetectionActivity, haarcascade_frontalface_alt.xml) }拷贝完成后调用init()方法传入路径 override fun onResume() {super.onResume()//省略了其他代码...//Utils类可以在本文末尾复制val path Utils.getModelFile(thisFaceDetectionActivity,haarcascade_frontalface_alt.xml).absolutePathinit(path)}4. 实现CascadeDetectorAdapter 这里我们需要将我的另一篇博客中的 在Visual Studio上使用OpenCV实现人脸识别 (下面统称为VS实现) 中的代码移植过来。 这里创建了CascadeDetectorAdapter实现了DetectionBasedTracker::IDetector接口和VS实现上代码是一样的。 class CascadeDetectorAdapter : public DetectionBasedTracker::IDetector { public:CascadeDetectorAdapter(cv::Ptrcv::CascadeClassifier detector) :IDetector(),Detector(detector){CV_Assert(detector);}void detect(const cv::Mat Image, std::vectorcv::Rect objects){Detector-detectMultiScale(Image, objects, scaleFactor, minNeighbours, 0, minObjSize, maxObjSize);}virtual ~CascadeDetectorAdapter(){}private:CascadeDetectorAdapter();cv::Ptrcv::CascadeClassifier Detector; };cv::PtrDetectionBasedTracker tracker;5. 实现init方法 init方法也是一样的声明tracker对象并调用run()方法会启动一个异步线程后面的人脸检测会在这个异步线程进行检测了。(这个是保障实时人脸检测不卡的前提) //cv::PtrDetectionBasedTracker tracker; DetectionBasedTracker *tracker 0;extern C JNIEXPORT void JNICALL Java_com_heiko_myopencvtest_FaceDetectionActivity_init(JNIEnv *env, jobject thiz, jstring path) {string stdFileName env-GetStringUTFChars(path, 0);//创建一个主检测适配器cv::PtrCascadeDetectorAdapter mainDetector makePtrCascadeDetectorAdapter(makePtrCascadeClassifier(stdFileName));//创建一个跟踪检测适配器cv::PtrCascadeDetectorAdapter trackingDetector makePtrCascadeDetectorAdapter(makePtrCascadeClassifier(stdFileName));//创建跟踪器DetectionBasedTracker::Parameters DetectorParams;//tracker makePtrDetectionBasedTracker(mainDetector, trackingDetector, DetectorParams);tracker new DetectionBasedTracker(mainDetector, trackingDetector, DetectorParams);tracker-run(); } 5. 设置Surface 在 Android NDK 中ANativeWindow 是一个C/C接口它提供了一种在 C 或 C 代码中访问 Android Surface 的方式。通过使用ANativeWindow接口开发者可以在NDK中直接访问和操作Android窗口系统实现图形处理和渲染操作。 这里我们将SurfaceView传到JNI中方便C/C代码后边将图像实时渲染到Android SurfaceView上。 #include android/native_window_jni.hANativeWindow *window 0;extern C JNIEXPORT void JNICALL Java_com_heiko_myopencvtest_FaceDetectionActivity_setSurface(JNIEnv *env, jobject thiz,jobject surface) {if (window) {ANativeWindow_release(window);window 0;}window ANativeWindow_fromSurface(env, surface); }6. 处理数据并实现人脸识别 处理图像数据的部分我们在postData中实现这部分会先对图像进行处理然后进行人脸识别并渲染到SurfaceView上。 extern C JNIEXPORT void JNICALL Java_com_heiko_myopencvtest_FaceDetectionActivity_postData(JNIEnv *env, jobject instance, jbyteArray data_,jint w, jint h, jint cameraId) {//待实现的代码 }6.1 将图片转化为Mat 参数中的jbyteArray data_是从Android Java层中获取到的。 然后转化为jbyte *data这个字节数组接着将其转为一个Mat矩阵。 Mat是是OpenCV最基本的数据结构。它用于存储图像数据。 需要注意的是由于传入的数据是YUV420每个像素占1.5byte 所以这个图像的宽度需要传入实际宽度*1.5宽度不变。 这里的CV_8UC1是单通道的意思就是说无论是Y分量还是U、V分量都存储在同一个通道里。 jbyte *data env-GetByteArrayElements(data_, NULL); Mat src(h h / 2, w, CV_8UC1, data);要获取Mat对象中每个通道的数据可以使用OpenCV提供的函数和方法。 对于一个BGR图像即具有三个通道的图像每个通道的数据可以分别获取并进行处理。 以下是一些示例代码演示如何获取每个通道的数据 // 假设img是包含BGR图像的Mat对象 // 获取B通道数据 Mat bChannel img.channel(0); // 获取G通道数据 Mat gChannel img.channel(1); //获取R通道数据 Mat rChannel img.channel(2); 6.2 将YUV转为RGBA 接着需要将YUV格式转化为RGBA格式方便后续的操作。 这里的COLOR_YUV2RGBA_NV21表示原始是NV21的YUV格式将其转为RGBA格式。 cvtColor(src, src, COLOR_YUV2RGBA_NV21);6.3 对图像做翻转和镜像 由于手机摄像头硬件安装在手机里时和屏幕的方向并不是一致的所以需要将摄像头拍摄的画面进行旋转。 如果是前置摄像头 : 需要将画面逆时针旋转90度并做左右镜像操作如果是后置摄像头 : 需要将画面顺时针旋转90度 if (cameraId 1) {//前置摄像头rotate(src, src, ROTATE_90_COUNTERCLOCKWISE);//1:左右镜像//0:上下镜像flip(src, src, 1); } else {//顺时针旋转90度rotate(src, src, ROTATE_90_CLOCKWISE); }6.4 转为灰度图并进行直方图均衡化处理 接着需要对图像进行灰度和直方图均衡化处理以便提高人脸识别的准确性和可靠性这部分和VS实现上是一样。 Mat gray; //转为灰度图 cvtColor(src, gray, COLOR_RGBA2GRAY); //直方图均衡化 equalizeHist(gray, gray);6.5 进行人脸检测 接着就可以调用tracker-process来建人脸检测了。 检测完成后接着调用tracker-getObjects将检测的人脸位置赋值给faces。 std::vectorRect faces; tracker-process(gray); tracker-getObjects(faces);6.6 将人脸用红框框出来 接着将识别到的人脸用红色的矩形框绘制出来rectangle方法就是用来绘制一个矩形框的方法。 for (Rect face : faces) {rectangle(src, face, Scalar(255, 0, 0)); }6.7 将图像渲染到SurfaceView上 6.7.1 设置窗口缓冲区 ANativeWindow_setBuffersGeometry是设置Android Native窗口的缓冲区的大小和像素格式。 if (window) {ANativeWindow_setBuffersGeometry(window, src.cols, src.rows, WINDOW_FORMAT_RGBA_8888);//后续代码在这里编写... }6.7.2 将图像数据填充到窗口的缓冲区 这里是个while循环会不断地将图像数据(RGBA)填充到窗口的缓冲区最后调用ANativeWindow_unlockAndPost提交刷新图像就渲染到SurfaceView上了。 ANativeWindow_Buffer window_buffer; do {//如果 lock 失败直接 breakif (ANativeWindow_lock(window, window_buffer, 0)) {ANativeWindow_release(window);window 0;break;}//将window_buffer.bits转化为 uint8_t *uint8_t *dst_data static_castuint8_t *(window_buffer.bits);//stride : 一行多少个数据 RGBA * 4int dst_linesize window_buffer.stride * 4;//一行一行拷贝for (int i 0; i window_buffer.height; i) {memcpy(dst_data i * dst_linesize, src.data i * src.cols * 4, dst_linesize);}//提交刷新ANativeWindow_unlockAndPost(window); } while (0);6.8 回收资源 最后别忘了回收资源 src.release(); gray.release(); env-ReleaseByteArrayElements(data_, data, 0);7. 运行项目 我们可以看到效果如下至此我们就完成在Android上使用OpenCV实现实时的人脸识别了。 8. 本文源码下载 Android和Windows下使用OpenCV实现人脸识别 示例 Demo 9. OpenCV系列文章 Visual Studio 2022 cmake配置opencv开发环境_opencv visualstudio配置_氦客的博客-CSDN博客 在Visual Studio上使用OpenCV实现人脸识别_氦客的博客-CSDN博客 Android Studio 接入OpenCV并实现灰度图效果_氦客的博客-CSDN博客 Android 使用OpenCV实现实时人脸识别并绘制到SurfaceView上_氦客的博客-CSDN博客 ❤️ 如果觉得这篇博文写的不错对你有所帮助帮忙点个赞 ⭐ 这是对我持续输出高质量博文的最好鼓励。
http://www.pierceye.com/news/431958/

相关文章:

  • 百度云建站WordPress开发新客户的十大渠道
  • 南宁比优建站视屏网站的审核是怎么做的
  • 怎样建设尧都水果网站免费手机网站建站系统
  • 全网营销提供seo服务
  • 吕梁网站设计服务器网站建设维护合同
  • 网站轮播图片怎么做高校网站建设模板
  • 易语言做返利网站企业培训考试平台官网
  • 天津做不锈钢的网站做网站要几个部门组成
  • 宿迁集团网站建设用dw制作一个网站
  • 网站创建二级域名网络营销到底是个啥
  • 银州手机网站建设做网站前台模型要做什么呢
  • 做彩票网站推广网站建设培训方案
  • o2o网站建设多少钱昆山专业网站建设
  • c语言自学免费网站网站制作职业
  • 免费刷赞网站推广qq免费有哪些网页设计软件
  • 如何设计网站的首页做海鲜代理在什么网站
  • 网站分析的优劣势苏州网络推广企业
  • 威海网站建设公司施工企业成本核算方法
  • 网站群集约化建设cc域名做门户网站
  • 怎么看一个网站做的好不好北京企业网站推广
  • 网站后台访问权限设置静宁网站建设
  • 网站是什么时候开始的怎样做知道网站
  • 安丘做网站的有那个网站
  • 网站建设佰首选金手指六门户网站 解决方案
  • 怎么可以创建网站十大管理培训课程
  • 网络安全管理系统佛山厂家推广优化
  • 网站建设 外包是什么意思微信小程序低代码开发
  • 网站底部信息用js写法莱芜雪野湖有什么好玩的
  • 青岛高品质网站制作优化快速排名教程
  • 地产项目网站长沙建个网站一般需要多少钱