android:layout_height=“wrap_content”
android:text=“灰度化”
android:id=“@+id/textView_togray” />
<ImageView
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:id=“@+id/imageView_after” />
MainActivity.java文件:
package edu.finu.cse.opencv2;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
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;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
ImageView img_after;
TextView text_togray;
Bitmap srcBitmap;
Bitmap grayBitmap;
private static boolean flag = true;
//private static boolean isFirst = true;
private static final String TAG = “MainActivity”;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img_after=(ImageView)findViewById(R.id.imageView_after);
text_togray=(TextView)findViewById(R.id.textView_togray);
text_togray.setOnClickListener(this);
}
//OpenCV库加载并初始化成功后的回调函数
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
// TODO Auto-generated method stub
switch (status){
case BaseLoaderCallback.SUCCESS:
Log.i(TAG, “成功加载”);
Toast toast = Toast.makeText(getApplicationContext(),
“成功加载!”, Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
break;
default:
super.onManagerConnected(status);
Log.i(TAG, “加载失败”);
Toast toast1 = Toast.makeText(getApplicationContext(),
“加载失败!”, Toast.LENGTH_LONG);
toast1.setGravity(Gravity.CENTER, 0, 0);
toast1.show();
break;
}
}
};
public void procSrc2Gray(){
Mat rgbMat = new Mat();
Mat grayMat = new Mat();
srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.duling);
grayBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), Bitmap.Config.RGB_565);
Utils.bitmapToMat(srcBitmap, rgbMat);//convert original bitmap to Mat, R G B.
Imgproc.cvtColor(rgbMat, grayMat, Imgproc.COLOR_RGB2GRAY);//rgbMat to gray grayMat
Utils.matToBitmap(grayMat, grayBitmap); //convert mat to bitmap
Log.i(TAG, “procSrc2Gray sucess…”);
}
@Override
public void onClick(View v)
{
switch(v.getId())
{
case R.id.textView_togray:
procSrc2Gray();
img_after.setImageBitmap(grayBitmap) ;
break;
}
}
@Override
public void onResume()
{
super.onResume();
if (!OpenCVLoader.initDebug()) {
Log.d(TAG, “Internal OpenCV library not found. Using OpenCV Manager for initialization”);
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_4_0, this, mLoaderCallback);
} else {
Log.d(TAG, “OpenCV library found inside package. Using it!”);
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
}
}
AndroidManifest.xml文件:
修改项目的Manifest.xml。因为新添加了Activity,这个Activity用到了相机权限等,所以要注册权限。
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android=“http://schemas.android.com/apk/res/android”
package=“edu.finu.cse.opencv2”>
<application
android:allowBackup=“true”
android:icon=“@mipmap/ic_launcher”
android:label=“@string/app_name”
android:roundIcon=“@mipmap/ic_launcher_round”
android:supportsRtl=“true”
android:theme=“@style/AppTheme”>
<activity android:name=“.ImageManipulationsActivity”
android:label=“MyTest”
android:screenOrientation=“landscape”
android:configChanges=“keyboardHidden|orientation”>
<uses-featurexu
android:name=“android.hardware.camera”
android:required=“false” />
<uses-feature
android:name=“android.hardware.camera.autofocus”
android:required=“false” />
<uses-feature
android:name=“android.hardware.camera.front”
android:required=“false” />
<uses-feature
android:name=“android.hardware.camera.front.autofocus”
android:required=“false” />
效果
1.准备训练数据
训练样本分两类:正样本和负样本。正样本是希望识别的物体的图像。负样本是其他物体的图像(不含有希望识别的物体)。正样本的图像大小应当一致,负样本不做要求,但是必须大于等于正样本图像。
负样本
负样本可以是任意图像,但是这些图像中不能包含待检测的物体。用于抠取负样本的图像文件名被列在一个文件中。这个文件是纯文本文件,文件中每行是一个文件名(包括路径和文件名)。这些图像可以是不同的尺寸,但是图像尺寸应该比训练窗口的尺寸大(比正样本大),因为这些图像将被用于抠取负样本,并将负样本缩小到训练窗口大小。
下面是一个描述文件的例子:
假如目录结构如下:
/img
img1.jpg
img2.jpg
bg.txt
则bg.txt文件中的内容将如下所示:
img/img1.jpg
img/img2.jpg
不管是负样本还是正样本,要想训练出识别率较高的分类器,样本数据都不会少,因此描述文件明显是不能手写的,下面是一个制作描述文件的方法。
C:\Users\Hasee>D:
D:>cd D:\opencvcar\car_sample
D:\opencvcar\car_sample>dir /b>text.txt
D:\opencvcar\car_sample>
先进入存有图像的目录,然后通过输出重定向将文件名一次性存到指定的文件中。然后通过文本编辑器的替换功能在每一行的行头添加文件的路径。
正样本
正样本的描述文件中的每一行除了图像的文件名和文件路径以外,还需要提供一些参数,下面是一个例子。
D:\opencvcar\car_sample\ImgData1.bmp 1 0 0 33 33
其中,1表示该图像中希望识别的物体的数量;0,0,33,33,标示其在图像中的位置和大小的矩形为(0, 0, 33, 33)。
正样本由 opencv_createsamples 生成。opencv_createsamples 是opencv提供的创建正样本的可执行程序。
以下是生成正样本的一个批处理文件的例子,
opencv_createsamples.exe -info car_list.txt -vec car_samples.vec -bg ng_data.txt -num 580 -w 33 -h 33
pause
opencv_createsamples.exe的参数:
- -info <collection_file_name>
描述物体所在图像以及大小位置的描述文件
- -vec <vec_file_name>
输出文件,内含用于训练的正样本
- -bg <background_file_name>
背景图像(负样本)的描述文件,文件中包含一系列的图像文件名,这些图像将被随机选作物体的背景
- -num <number_of_samples>
生成的正样本的数目
- -w <sample_width>
输出样本的宽度(以像素为单位)
- -h <sample_height>
输出样本的高度(以像素为单位)
2.训练级联分类器
下面是训练分类器的一个批处理文件的例子
opencv_traincascade.exe -data data -vec car_samples.vec -bg ng_data.txt -numPos 580 -numNeg 3000 -numStages 7 -w 33 -h 33
pause
opencv_traincascade.exe的参数:
- -data <cascade_dir_name>
目录名,如不存在训练程序会创建它,用于存放训练好的分类器
- -vec <vec_file_name>
包含正样本的vec文件名(由 opencv_createsamples 程序生成)
- -bg <background_file_name>
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
结尾
如何才能让我们在面试中对答如流呢?
答案当然是平时在工作或者学习中多提升自身实力的啦,那如何才能正确的学习,有方向的学习呢?为此我整理了一份Android学习资料路线:
这里是一份BAT大厂面试资料专题包:
好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划。来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
义、实战项目、讲解视频,并且会持续更新!**
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
[外链图片转存中…(img-89Zln4ef-1713781609918)]
结尾
如何才能让我们在面试中对答如流呢?
答案当然是平时在工作或者学习中多提升自身实力的啦,那如何才能正确的学习,有方向的学习呢?为此我整理了一份Android学习资料路线:
[外链图片转存中…(img-iZ7JXRxh-1713781609918)]
这里是一份BAT大厂面试资料专题包:
[外链图片转存中…(img-4HbN7P55-1713781609919)]
好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划。来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!