WINDOWS系统Eclipse+NDK+Android + OpenCv

WINDOWS系统Eclipse+NDK+Android + OpenCv

参考文档博客

1 NDK环境搭建

http://jingyan.baidu.com/article/5d6edee22d908799eadeec9f.html

2 官方文档

Android.mk与Application.mk如何编写,OpenCV库如何调用

http://docs.opencv.org/trunk/doc/tutorials/introduction/android_binary_package/dev_with_OCV_on_Android.html#dev-with-ocv-on-android

3 OpenCv测试代码来源

http://www.verydemo.com/demo_c131_i131095.html

4 NDK OpenCv测试入门程序(有问题)

http://blog.csdn.net/pwh0996/article/details/8957764

5 NDK测试入门程序(有问题)

http://blog.csdn.net/redoffice/article/details/6654714

6 出现部分问题的解法

http://blog.csdn.net/houshunwei/article/details/17217695

 

目前Android平台下调用OpenCv库函数有两种方式:

1使用封装的OpenCV API开发android:这种方式调用Java的包中的类实现类似。

2 利用JNI接口通过NDK平台调用OpenCV API函数(这种方式比较普遍)。

本文将实现这两种方式的调用。

第一部分 准备工作:

1.1本文所使用的软件版本如下:

ADT版本:ADT-22.6.3 ,开发工具ADT(Android Development Tool),集成了最新的ADT和NDK插件以及Eclipse,还有一个最新版本SDK。解压之后就可以用了,下载地址http://developer.android.com/tools/sdk/ndk/index.html

NDK: android-ndk-r10, NDK插件:用于开发Android NDK的插件,ADT版本在20以上,就能安装NDK插件,另外NDK集成了CDT插件,NDK版本在r7以上之后就集成了Cygwin,而且还是十分精简版。下载链接见:http://developer.android.com/tools/sdk/ndk/index.html

OpenCV:OpenCV-2.4.4-android-sdk,下载地址http://opencv.org/downloads.html

 

1.2 配置NDK的环境变量

1.2.1解压NDK压缩包,配置环境变量。

将解压的地址写入环境变量PATH中。在命令提示符下输入ndk-build如果弹出如下的错误,而不是说ndk-build not found,就说明ndk环境已经安装成功了。特别提示一下,搜索引擎中会告诉一些早期的NDK版本的使用,是在命令提示符下输入build/host- setup.sh;但是NDK经过更新,这个文件已经没有了。只需要输入ndk-build就可以了。

Android NDK: Could not find application project directory !   
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.   
/home/braincol/workspace/android/android-ndk-r5/build/core/build-local.mk:85: *** Android NDK: Aborting    .  Stop.

1.2.2 Eclipse配置NDK环境

打开Eclipse,点Window->Preferences->Android->NDK,设置NDK路径,例如当前的NDK版本是是E:\android-ndk-r10。

1.3 配置OpenCv

下载OpenCV-2.4.4-android-sdk解压出来,可以看到文件下有apk文件,doc文档,sample例子程序,以及OpenCV4Android-sdk。

其 中,OpenCV4Android-sdk目录即是我们开发opencv所需要的类库;samples目录中存放着若干opencv应用示例(包括人脸检测等),可为我们进行 android下的opencv开发提供参考;doc目录为opencv类库的使用说明及api文档等;而apk目录则存放着对应于各内核版本的。

 

1.3.1 安装OpenCV_Manager

    OpenCV_2.4.3.2_Manager_2.4应用安装包。此应用用来管理手机设备中的opencv类库,在运行opencv应用之前,必须确保手机中已经安装了OpenCV_2.4.4.4_Manager_2.6_*.apk,否则opencv应用将会因为无法加载opencv类库而无法运行。

可以根据自己的手机类型来安装OpenCV_2.4.4.4_Manager.apk.

通过查询自己的手机CPU信息

adb shell

cat /proc/cpuinfo

 

我的手机是arm v7 –neon 架构的,Android版本为4.4.4选择第3个,第四个是适用于低版本Android系统的手机。

安装完毕后,可以测试OpenCV_2.4.4.4_Manager.apk.是否正确。

在samples文件架中找个例子安装包,如example-15-puzzle.apk,安装到手机测试这个拼图游戏是否正常运行。

 

1.3.2 OpenCV4Android-sdk引入工作空间

(1) 将OpenCV4Android-sdk目录copy至后面的Android工程的工作空间;

(2)打开eclipse,将OpenCV-SDK引入到工作空间中,如下图所示:

 

第二部分 开始实战---使用封装的OpenCV API开发android(不通过jni接口)

 

1.1 创建工程

(1) 打开eclipse,创建android应用工程API_OPENCV;

(2) 在手机的的SD卡根目录/sdcard上新建一个目录andimg ,放入图像img1.jpg

(3) 在Package Explorer中选择项目API_OPENCV,单击右键在弹出菜单中选择Properties,

然后在弹出的Properties窗口中左侧选择 Android,然后点击右下方的Add按钮,选择OpenCV Library 2.4.4并点击OK,

操作完成后,会将OpenCV类库添加到API_OPENCV的Android Dependencies中,如下图所示:

 

1.2 工程代码:

 

(1)布局文件:main.xml

<RelativeLayout 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"tools:context="${packageName}.${activityClass}" ><Buttonandroid:id="@+id/imagegray"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="图像灰度化" /><ImageViewandroid:id="@+id/imageview"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/imagegray"android:layout_centerHorizontal="true"android:layout_marginTop="86dp" /></RelativeLayout> 

 

 

(2) 在AndroidManifest.xml文件中加入

 

 <!-- 在SDCard中创建与删除文件权限 --><uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><!-- 往SDCard写入数据权限 --><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

 

 

如图所示


 (3) MainActivity.java

 

package com.example.api_opencv;import org.opencv.android.BaseLoaderCallback;import org.opencv.android.LoaderCallbackInterface;import org.opencv.android.OpenCVLoader;import org.opencv.android.Utils;import org.opencv.core.Mat;import org.opencv.imgproc.Imgproc;import android.annotation.SuppressLint;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.Bitmap.Config;import android.graphics.BitmapFactory;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageView;public class MainActivity extends Activity {private Button btngray;private ImageView imageview;private Bitmap bmp;//OpenCV类库加载并初始化成功后的回调函数,在此我们不进行任何操作private BaseLoaderCallback mOpenCVCallBack = new BaseLoaderCallback(this) {@Overridepublic void onManagerConnected(int status) {switch (status) {case LoaderCallbackInterface.SUCCESS:{} break;default:{super.onManagerConnected(status);} break;}}};@SuppressLint("SdCardPath")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);this.setTitle("Android API OpenCV");btngray = (Button)findViewById(R.id.imagegray);imageview = (ImageView)this.findViewById(R.id.imageview);bmp=BitmapFactory.decodeFile("/sdcard/andimg/img1.jpg");imageview.setImageBitmap(bmp);btngray.setOnClickListener(new OnClickListener() {    @Overridepublic void onClick(View v) {Mat rgbMat = new Mat();Mat grayMat = new Mat();//获取lena彩色图像所对应的像素数据
Utils.bitmapToMat(bmp, rgbMat);//将彩色图像数据转换为灰度图像数据并存储到grayMat中
Imgproc.cvtColor(rgbMat, grayMat, Imgproc.COLOR_RGB2GRAY);//创建一个灰度图像
Bitmap grayBmp = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), Config.RGB_565);//将矩阵grayMat转换为灰度图像
Utils.matToBitmap(grayMat, grayBmp);imageview.setImageBitmap(grayBmp);}});}@Overridepublic void onResume(){//通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是//OpenCV_2.4.4_Manager_2.4_*.apk程序包,存在于OpenCV安装包的apk目录中super.onResume();OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_4, this, mOpenCVCallBack);}} 

 


1.3 运行结果

第三部分 开始实战--- 利用JNI接口通过NDK平台调用OpenCV API函数

  1. 新建一个Android工程 NDK_OPENCV(后面将会看到这种命名方式不是很好)

    默认使用MainActivitiy,包名com.example.ndk_opencv

     

  2. 构建Android的Java层代码

     

(1)布局文件:main.xml

 

<RelativeLayout 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"
tools:context="${packageName}.${activityClass}" >
<Button
android:id="@+id/imagegray"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="图像灰度化" /><ImageView
android:id="@+id/imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/imagegray"
android:layout_centerHorizontal="true"
android:layout_marginTop="86dp" />
</RelativeLayout> 

 

 

 

 

(2) 在AndroidManifest.xml文件中加入

 

 <!-- 在SDCard中创建与删除文件权限 --><uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><!-- 往SDCard写入数据权限 --><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

 

 

 (3) MainActivity.java

 

package com.example.ndk_opencv;import android.annotation.SuppressLint;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.Bitmap.Config;import android.graphics.BitmapFactory;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageView;@SuppressLint("SdCardPath")public class MainActivity extends Activity {private Button btngray;private ImageView imageview;private Bitmap bmp;@SuppressLint("SdCardPath")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);this.setTitle("Android NDK OpenCV");btngray = (Button)findViewById(R.id.imagegray);//btnProc.setOnClickListener(this);

imageview = (ImageView)this.findViewById(R.id.imageview);bmp=BitmapFactory.decodeFile("/sdcard/andimg/img1.jpg");imageview.setImageBitmap(bmp);//点击按钮,调用Opencv接口实现SD卡中的图片灰度化

btngray.setOnClickListener(new OnClickListener() {    @Overridepublic void onClick(View v) {bmp=BitmapFactory.decodeFile(stringNDKOPENCV());imageview.setImageBitmap(bmp);}});}//通过jni接口实现的本地函数public native String stringNDKOPENCV();static {System.loadLibrary("NDK_OPENCV");}}

 

3.2 配置工程的NDK编译环境

 

3.2.1在工程上右键点击Android Tools->Add Native Support...,然后给我们的.so文件取个名字,例如: NDK_OPENCV(默认为工程名字)

这时候工程就会多一个jni的文件夹,jni下有Android.mk和NDK_OPENCV.cpp文件。

3.2.2工程右键,点Properties->C/C++ Build的Building Settings中去掉Use default build command,然后输入${NDKROOT}/ndk-build.cmd

3.2.3在C/C++ Build中点击Environment,点Add...添加环境变量NDKROOT,值为NDK的根目录E:\project\Android\adt-bundle-windows-x86-20140321\android-ndk-r10

3.3 编写NDK_OPENCV.cpp文件

3.3.1生成.h文件

在编写NDK_OPENCV.cpp文件前,需要利用javah这个工具生成相应的.h文件,然后根据这个.h文件编写相应的C/C++代码。用eclipse编译该工程,生成相应的.class文件,这步必须在下一步之前完成,因为生成.h文件需要用到相应的.class文件。暂时不考虑报错信息。

进入到刚才建立的NDK_OPENCV工程目录中,在工程目录下执行: 

Javah -classpath bin\classes -d jni com.example.ndk_opencv.MainActivity

这里-classpath表示类的路径;-d jni表示生成的.h文件存放的目录com.example.ndk_opencv.MainActivity则是完整的类名。现在可以在jni目录下看到多了一个.h文件:com_example_ndk_opencv_MainActivity.h;

打开后,可以看到.h的内容:

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_example_ndk_opencv_MainActivity */#ifndef _Included_com_example_ndk_opencv_MainActivity#define _Included_com_example_ndk_opencv_MainActivity#ifdef __cplusplusextern "C" {#endif/** Class: com_example_ndk_opencv_MainActivity* Method: stringNDKOPENCV* Signature: ()Ljava/lang/String;*/JNIEXPORT jstring JNICALL Java_com_example_ndk_1opencv_MainActivity_stringNDKOPENCV(JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif 

 

代码解释:

  1. JNI接口的命名规范是:Java_ + 调用该方法的包名(包名的点用_代替) + _ + 调用该接口的类名 + _ + 方法名。函数名比较长但是完全按照:java_pacakege_class_mathod 形式来命名。也就是说:MainActivity.java中stringNDKOPENCV () 方法对应于 C/C++中的 Java_com_example_ndk_1opencv_MainActivity_stringNDKOPENCV () 方法。
  2. 对于实例方法, JNIEXPORT 和 JNICALL 是jni的宏,在android的jni中不需要,当然写上去也不会有错。注意下其中的注释:Signature: ()Ljava/lang/String表示函数的参数为空,这里为空是指除了JNIEnv *, jobject 这两个参数之外没有其他参数,JNIEnv*, jobject是所有jni函数必有的两个参数,分别表示jni环境和对应的java类(或对象)本身,Ljava/lang/String表示函数的返回值是java的String对象。
  3. ndk_1opencv 代码中的红色标记处多了个1,这个1应该表示ndk_opencv为一个整体而非继承结构,因此不建议包名出现空格,以免出错。

3.3.2 编写NDK_OPENCV.cpp

#include <jni.h>#include <string.h>#include <opencv2/core/core.hpp>#include <opencv2/features2d/features2d.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/calib3d/calib3d.hpp>#include <opencv2/imgproc/imgproc_c.h>extern "C" jstringJava_com_example_ndk_1opencv_MainActivity_stringNDKOPENCV( JNIEnv* env,jobject thiz ){//return env->NewStringUTF("/sdcard/andimg/img2.jpg");const char* file="/sdcard/andimg/img1.jpg";IplImage* object = cvLoadImage(file,CV_LOAD_IMAGE_GRAYSCALE);std::string filePath="/sdcard/andimg/img1_result.jpg";jstring filePath1=env->NewStringUTF(filePath.c_str());const char * resultpath=env->GetStringUTFChars(filePath1, 0);cvSaveImage(resultpath,object);//env->ReleaseStringUTFChars(path, file);
env->ReleaseStringUTFChars(filePath1, resultpath);return filePath1;} 

 

代码解释:这段代码首先读取了SD卡中的一张图像,接着调用env->GetStringUTFChars,以灰度形式读取图像并保存在SD卡中,最后返回灰度图像的路径。

3.4利用NDK平台编译C++语言函数成.so文件

3.4.1首先需要编写Android.mk文件

LOCAL_PATH := $(call my-dir)

include$(CLEAR_VARS)

# OpenCV

OPENCV_CAMERA_MODULES:=on

OPENCV_INSTALL_MODULES:=on

OPENCV_LIB_TYPE:=STATIC

include E:\project\JavaWork\JavaExistWork\sdk\native\jni\OpenCV.mk

LOCAL_MODULE := NDK_OPENCV

LOCAL_SRC_FILES := NDK_OPENCV.cpp

include$(BUILD_SHARED_LIBRARY)

 

3.4.2同时建立Application.mk文件

APP_STL := gnustl_static

APP_CPPFLAGS := -frtti -fexceptions

APP_ABI := armeabi-v7a

APP_PLATFORM := android-9

 

4测试运行

    如果在Eclipse下面打开NDK_OPEC.cpp文件会出现很多错误,需要将错误删除掉,否则无法编译。

"Eclipse可能报一堆的错误提示 由于eclipse的语法检查,当你打开一个源码,尤其是引入外面开发完成的项目,因为源码不是在工程中管理的,大部分情况会报一堆的错误提示,而你是明 确这些问题实际上是不存在的,那么就可以这样子做了,设置项目属性,把eclipse多管的这些闲事给免了它的职,如下图,保存后,你会发现你的 problems窗口下非常清爽了:"

解决方法之一:需要将错误删除掉,否则无法编译。

解决方法之二:打开工程属性,选择C/C++ General 中的Code Analysis ,接着选择Useproject setting 去掉Syntax and Semantic……,这是Eclipse在检测一些不符合java中的符号报错,其实代码没有错的。

 

 

运行结果

转载于:https://www.cnblogs.com/adong7639/p/3925347.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正确理解JavaScript

过去几年我注意到技术圈一个很奇怪的现象&#xff0c;有太多程序员将那些他们只是有过非常浅显的了解&#xff0c; 但其实根本就不懂的技术写到他们的简历中&#xff0c;这个现象几乎每种语言都有&#xff0c;但这其中最严重的就要数javascript了。 你不知道你不懂 出现这种状况…

医疗机构远程视频监控集中管理,贝锐蒲公英提供一站式解决方案

上海某企业专业致力于医疗软件、家居智能化研发、设计、销售、集成及实施&#xff0c;企业主营业务之一为医疗软件&#xff0c;涉及PACS/RIS/WEB/HIS、示教系统等方面的医院信息化建设。 在实际应用、部署过程中&#xff0c;需要实现各地区分院与总院间的数据库互相访问、视频数…

JAVA_Collection容器

因为项目的需要&#xff0c;今天抽时间把JAVA中的容器复习了一下&#xff0c;为了以后的不时之需&#xff0c;现在把它记下来。 容器有其名&#xff0c;知其意&#xff0c;用来盛放数据的集合&#xff0c;JAVA中为我们提供了三种容器类&#xff1a;set、list、map&#xff0c;三…

控制器中获取Field值

在ASP.NET MVC程序中&#xff0c;我们需要POST Data到制器中&#xff0c;是有很多方法。但是我们想在控制器中&#xff0c;获取Feild值呢&#xff1f;怎样获取&#xff1f;你可以留意到有一个类FormCollection。它能帮助到我们解决这个问题。 举个简单的例子。在ASP.NET MVC应用…

私有RTP协议和标准流媒体协议

先介绍下RTP协议&#xff1a; 实时传输协议RTP&#xff08;Real-time Transport Protocol&#xff09;是一个网络传输协议 &#xff0c;该协议详细说明了在互联网上传递音频和视频的标准数据包格式 。 RTP标准定义了两个子协议 &#xff0c;RTP和RTCP 数据传输协议RTP&#xff…

从WebRtc学习RTP协议

文章目录TCP为何不适用于实时音视频UDP->RTPRTP协议结构JittbufferRTP扩展头RTP填充数据参考TCP为何不适用于实时音视频 可靠性是以牺牲实时性为代价的。按照TCP原理&#xff0c;当出现极端网络情况时&#xff0c;理论上每个包的时延可达到秒级以上&#xff0c;而且这种时延…

解决ListView异步加载数据之后不能点击的问题

在ListView的onScroll事件中执行异步加载数据&#xff0c;然后使用notifyDataSetChange()函数更新适配器&#xff0c;之后发现listView不能点击了&#xff0c;这问题苦恼了我半天。最后在一篇博文中发现调用listView的requestFocusFromTouch()函数终于解决了这问题。 Java代码…

从WebRtc学习RTCP协议

文章目录RTCP支持的消息类型RTCP协议头WebRTC的反馈报文RTPFB支持的报文类型&#xff1a;PSFB支持的报文类型&#xff1a;参考RTCP是RTP的控制协议.那么RTCP能对RTP做哪些控制呢&#xff1f;其中最为大家熟知的就是 丢包控制。发送端发送数据后&#xff0c;接收端如果发现有RTP…

无锁队列设计思路以及简要代码

文章目录非并发的一写一读环形队列多读多写环形队列非并发的一写一读环形队列 读指针&#xff1a; 1、先判断是否有数据 2、读取数据 3、操作指针 写指针&#xff1a; 1、先判断空间是否足够 2、写入数据 3、操作指针 所以代码也十分简单&#xff1a; bool putqueue(void* pDa…

CPU Cache对于并发编程的影响

文章目录引子CPU Cache对于并发的影响读写顺序对性能的影响字节对齐对Cache的影响小结引子 下面给出两个极其相似的代码&#xff0c;运行出的时间却是有很大差别&#xff1a; 代码一 #include <stdio.h> #include <pthread.h> #include <stdint.h> #includ…

软工之初识

我们之前已经在完全不懂软件工程的情况下&#xff0c;已经做完了两个小系统&#xff0c;虽然能够运行&#xff0c;但其中有很多的问题&#xff0c;学习软工就是让我们在工程学原理的指导之下去开发和设计软件。 软件工程同大多数书讲的都是一样的&#xff0c;首先对软件工程有一…

perf +火焰图使用

以mysqld进程为例&#xff1a; [rootVM-90-225-centos ~]# ps -ef | grep mysqld root 9808 9621 0 19:30 pts/7 00:00:00 grep --colorauto mysqld root 16104 1 0 17:30 pts/0 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir/usr/loc…

在一个字符串中找到第一个只出现一次的字符

题目&#xff1a;在一个字符串中找到第一个只出现一次的字符&#xff0c;如输入abaccdeff&#xff0c;则输出b&#xff1b;具体实现如下&#xff1a;#include <iostream> #include <string> using namespace std; void FindChar(const string &strBuf) {int nA…

零拷贝机制在文件传输中的使用手法

文章目录文件传输&#xff08;读取与发送&#xff09;中的拷贝与上下文切换零拷贝技术sendfilesendfile SG-DMAmmap writespliceDirect I/O经典应用文件传输&#xff08;读取与发送&#xff09;中的拷贝与上下文切换 如果服务端要提供文件传输的功能&#xff0c;最简单的方式…

POJ 3233 Matrix Power Series 矩阵快速幂 + 二分

题意&#xff1a;求矩阵的次方和 解题思路&#xff1a;最容易想到方法就是两次二分因为 我们可以把一段 A^1 A^2 .......A^K 变成 A^1 ..A^(K/2) ( A^1 ..A^(K/2))*(A^(k/2)) 当k 为奇数的时候 或者 A^1 ..A^(K/2) ( A^1 ..A^(K/2))*(A^(k/2)) A^K 当K 为偶数的时候…

时间序列进行分析的一些手法以及代码实现(移动平均、指数平滑、SARIMA模型、时间序列的(非)线性模型)

文章目录1、移动平均moving average方法weighted average方法2、指数平滑单指数平滑 exponential_smoothing双指数平滑三指数平滑 Triple exponential smoothing3、平稳性以及时间序列建模SARIMA模型4、时间序列的&#xff08;非&#xff09;线性模型时间序列的滞后值使用线性回…

三大平衡树(Treap + Splay + SBT)总结+模板

Treap树 核心是 利用随机数的二叉排序树的各种操作复杂度平均为O(lgn) Treap模板&#xff1a; #include <cstdio> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <cstdlib> #include <cmath…

mysqld进程 ut_delay 占用率过高

采用性能分析工具perf top -p mysqld进程 在测试mysql数据库时&#xff0c;用perf top如果看到热点函数是ut_delay或者_raw_spin_lock的话&#xff0c;说明锁争用比较严重。 ut_delay这是innodb的一个自旋琐。也就是说&#xff0c;在这里由于锁等待&#xff0c;innodb不停地在…

滑动窗口在重构数据集的作用

step1&#xff1a;使用滑动窗口重构数据集 给定时间序列数据集的数字序列&#xff0c;我们可以将数据重构为看起来像监督学习问题。 我们可以通过使用以前的时间步作为输入变量并使用下一个时间步作为输出变量来做到这一点。 通过观察重构后的数据集与原本的时间序列&…