android javacv android怎么将值赋给Mat

android安卓图片序列转视频、录屏原理(javacv实现) - 下载频道
- CSDN.NET
&&&&android安卓图片序列转视频、录屏原理(javacv实现)
android安卓图片序列转视频、录屏原理(javacv实现)
已精简so包,完全由javacv实现从图片或者Bitmap到视频的录制,有完整配置界面,支持录像和暂停以及重启需要导入lib文件夹下的javacv.jar和javacpp.jar两个包
若举报审核通过,可奖励20下载分
被举报人:
jackyanjiaqi
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
您可能还需要
移动开发下载排行Android 人脸识别+人脸匹配(OpenCV+JavaCV)
编辑:www.fx114.net
本篇文章主要介绍了"[置顶]
Android 人脸识别+人脸匹配(OpenCV+JavaCV)",主要涉及到[置顶]
Android 人脸识别+人脸匹配(OpenCV+JavaCV)方面的内容,对于[置顶]
Android 人脸识别+人脸匹配(OpenCV+JavaCV)感兴趣的同学可以参考一下。
项目源码&&
之前不想上传源码是因为代码写的实在很烂,参考价值不是很大,主要代码都在CameraActivity中
这里吐下槽,目前Android人脸识别技术分享的感觉很少
我也是参考一些资料和别人的代码加以改进
上个项目中用到的技术现在有些遗忘了,把关键性的代码给大家分享下
public void DetectFace() {
Mat image = Highgui.imread(FACE);
MatOfRect faceDetections = new MatOfRect();
mJavaDetector.detectMultiScale(image, faceDetections);
for (Rect rect : faceDetections.toArray()) {
Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x
+ rect.width, rect.y + rect.height), new Scalar(0, 255, 0));
// 把检测到的人脸重新定义大小后保存成文件
Mat sub = image.submat(rect);
Mat mat = new Mat();
Size size = new Size(100, 100);
Imgproc.resize(sub, mat, size);
Highgui.imwrite(FACEDONE, mat);
FACE和FACEDONE为两个路径 一个是拍照完成的图片路径,另一个是生成的人脸图片的路径
这里使用了OpenCV中的人脸识别方法,方法很简单,把你的照片路径带进去他会检测到这张图片里有多少个人头,然后进行循环输出人脸图片
这里需要注意下的是 如果进行人脸比对的话需要每张图片的大小一样,否则会报异常
另外,想使用OpenCV之前还需定义一个BaseLoaderCallback对象来加载识别的人脸xml库
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS: {
mJavaDetector = new CascadeClassifier(
&/sdcard/FaceDetect/haarcascade_frontalface_alt2.xml&);
default: {
super.onManagerConnected(status);
然后在OnResume中加载BaseLoaderCallback对象
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_5, this,
mLoaderCallback);
人脸匹配使用的是JavaCV中的匹配方法
该方法的博客一会附上连接
public int Identification() {
FaceRecognizer fr = createFisherFaceRecognizer();
MatVector mv = new MatVector(faceList.size());
CvMat cvMat = CvMat.create(faceList.size(), 1, CV_32SC1);
for (int i = 0; i & faceList.size(); i++) {
IplImage img = cvLoadImage(faceList.get(i).getPath(),
CV_LOAD_IMAGE_GRAYSCALE);
mv.put(i, img);
cvMat.put(i, 0, i);
fr.train(mv, cvMat);
IplImage testImage = cvLoadImage(
Environment.getExternalStorageDirectory()
+ &/FaceDetect/faceDone.jpg&, CV_LOAD_IMAGE_GRAYSCALE);
return fr.predict(testImage);
faceList中放的是人脸图片文件夹里所有人脸图片的路径
循环把他们放入MatVector和CvMat中
然后对FaceRecognizer进行训练
/FaceDetect/faceDone.jpg这个路径是经过上面识别方法处理完图片后所输出的人脸图片的路径
predict()方法把刚才的人脸图片放入训练模型中进行匹配 会返回一个模型中的索引值
获取到索引值后就大功告成了
下面一个方法可以获取到两张图片的相似度,最大值是100
public double CmpPic(String path) {
int l_bins = 20;
int hist_size[] = { l_bins };
float v_ranges[] = { 0, 100 };
float ranges[][] = { v_ranges };
IplImage Image1 = cvLoadImage(Environment.getExternalStorageDirectory()
+ &/FaceDetect/faceDone.jpg&, CV_LOAD_IMAGE_GRAYSCALE);
IplImage Image2 = cvLoadImage(path, CV_LOAD_IMAGE_GRAYSCALE);
IplImage imageArr1[] = { Image1 };
IplImage imageArr2[] = { Image2 };
CvHistogram Histogram1 = CvHistogram.create(1, hist_size,
CV_HIST_ARRAY, ranges, 1);
CvHistogram Histogram2 = CvHistogram.create(1, hist_size,
CV_HIST_ARRAY, ranges, 1);
cvCalcHist(imageArr1, Histogram1, 0, null);
cvCalcHist(imageArr2, Histogram2, 0, null);
cvNormalizeHist(Histogram1, 100.0);
cvNormalizeHist(Histogram2, 100.0);
return cvCompareHist(Histogram1, Histogram2, CV_COMP_CORREL);
带入两张图片的路径即可,这里不在阐述
下面是源码,写的很烂,仅供参考
import static com.googlecode.javacv.cpp.opencv_contrib.createFisherFaceR
import static com.googlecode.javacv.cpp.opencv_core.CV_32SC1;
import static com.googlecode.javacv.cpp.opencv_highgui.CV_LOAD_IMAGE_GRAYSCALE;
import static com.googlecode.javacv.cpp.opencv_highgui.cvLoadI
import static com.googlecode.javacv.cpp.opencv_imgproc.CV_COMP_CORREL;
import static com.googlecode.javacv.cpp.opencv_imgproc.CV_HIST_ARRAY;
import static com.googlecode.javacv.cpp.opencv_imgproc.cvCalcH
import static com.googlecode.javacv.cpp.opencv_imgproc.cvCompareH
import static com.googlecode.javacv.cpp.opencv_imgproc.cvNormalizeH
import java.io.BufferedOutputS
import java.io.F
import java.io.FileOutputS
import java.util.ArrayL
import java.util.L
import java.util.T
import java.util.TimerT
import org.opencv.android.BaseLoaderC
import org.opencv.android.LoaderCallbackI
import org.opencv.android.OpenCVL
import org.opencv.core.C
import org.opencv.core.M
import org.opencv.core.MatOfR
import org.opencv.core.P
import org.opencv.core.R
import org.opencv.core.S
import org.opencv.core.S
import org.opencv.highgui.H
import org.opencv.imgproc.I
import org.opencv.objdetect.CascadeC
import android.app.A
import android.app.ProgressD
import android.content.I
import android.content.pm.ActivityI
import android.graphics.B
import android.graphics.BitmapF
import android.graphics.M
import android.hardware.C
import android.os.B
import android.os.E
import android.os.H
import android.os.M
import android.view.LayoutI
import android.view.SurfaceH
import android.view.SurfaceV
import android.view.V
import android.view.ViewG
import android.view.W
import android.view.WindowM
import android.widget.ImageV
import android.widget.T
dosoft.pojo.FaceP
import com.googlecode.javacv.cpp.opencv_contrib.FaceR
import com.googlecode.javacv.cpp.opencv_core.CvM
import com.googlecode.javacv.cpp.opencv_core.IplI
import com.googlecode.javacv.cpp.opencv_core.MatV
import com.googlecode.javacv.cpp.opencv_imgproc.CvH
public class CameraActivity extends Activity implements SurfaceHolder.Callback,
Camera.PictureCallback {
private List&FacePojo& faceList = new ArrayList&FacePojo&();
private ProgressDialog proD
private CascadeClassifier mJavaD
private SurfaceView mSurfaceV
private SurfaceH
private String FACE = &/sdcard/FaceDetect/face.jpg&;
private String FACEDONE = &/sdcard/FaceDetect/faceDone.jpg&;
private int t = 2;
private int angle = 0;
private boolean flag =
private FaceP
private int cameraC
private CameraUtil cu = new CameraUtil();
private int[] iconArr = new int[] { R.drawable.icon1, R.drawable.icon2,
R.drawable.icon3 };
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS: {
mJavaDetector = new CascadeClassifier(
&/sdcard/FaceDetect/haarcascade_frontalface_alt2.xml&);
default: {
super.onManagerConnected(status);
private Handler updateUI = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
proDialog.dismiss();
Intent intent = new Intent();
if (type == 0 || type == 1) {
index = Identification();
fp = faceList.get(index);
value = CmpPic(fp.getPath()) * 100;
// Toast.makeText(getApplicationContext(),
// &相似度:& + value + &--& + num, 0).show();
if (value & 70 && type != 2) {
intent.setClass(getApplicationContext(), SignFail.class);
startActivity(intent);
if (type == 0) {
Bundle bundle = new Bundle();
bundle.putString(&id&, fp.getId());
bundle.putString(&name&, fp.getName());
intent.putExtras(bundle);
intent.setClass(getApplicationContext(), SignIn.class);
startActivity(intent);
} else if (type == 1) {
Intent intent2 = getIntent();
Bundle bundle2 = new Bundle();
bundle2.putInt(&status&, 1);
bundle2.putString(&id&, fp.getId());
bundle2.putString(&name&, fp.getName());
intent2.putExtras(bundle2);
setResult(RESULT_OK, intent2);
} else if (type == 2) {
Intent intent2 = getIntent();
setResult(RESULT_OK, intent2);
private Timer dataTimer = new Timer();
private Handler dataHandler = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
int msgId = msg.
switch (msgId) {
if (flag && t == -1) {
// camera.autoFocus(null);
camera.takePicture(null, null, CameraActivity.this);
if (flag) {
timeDown();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().clearFlags(
WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);// 设置横屏模式以及全屏模式
setContentView(R.layout.camera);// 设置View
proDialog = new ProgressDialog(this);
Intent bundle = getIntent();
type = bundle.getIntExtra(&type&, 0);
mSurfaceView = (SurfaceView) findViewById(R.id.camera);
holder = mSurfaceView.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);// 指定Push Buffer
protected void onStart() {
super.onStart();
LoadFaceData();
protected void onResume() {
super.onResume();
if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_5, this,
mLoaderCallback);
public void onPictureTaken(byte[] data, Camera camera) {
String path = Environment.getExternalStorageDirectory()
+ &/FaceDetect/face.jpg&;
// data2file(data, path);
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
Matrix matrix = new Matrix();
// 设置图像的旋转角度
matrix.setRotate(angle);
// 旋转图像,并生成新的Bitmap对像
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
bitmap.getHeight(), matrix, true);
cu.writePhoto(bitmap, bitmap.getWidth(), bitmap.getHeight(), path);
if (type == 2) {
proDialog.setMessage(&正在检测...&);
proDialog.setMessage(&正在识别...&);
proDialog.show();
Thread loginThread = new Thread(new LoginFailureHandler());
loginThread.start();
} catch (Exception e) {
camera.startPreview();
class LoginFailureHandler implements Runnable {
public void run() {
DetectFace();
Message message = new Message();
message.what = 1;
updateUI.sendMessage(message);
public void surfaceCreated(SurfaceHolder holder) {
camera = Camera.open(camera());// 摄像头的初始化
camera.setPreviewDisplay(holder);
dataTimer.schedule(new TimerTask() {
public void run() {
Message message = new Message();
message.what = 1;
dataHandler.sendMessage(message);
}, 0, 2000);
} catch (Exception e) {
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
Camera.Parameters parameters = camera.getParameters();
// parameters.setPreviewSize();
camera.setParameters(parameters);// 设置参数
int flag = getWindowManager().getDefaultDisplay().getRotation();
angle = 450 - flag * 90;
if (angle &= 360) {
angle = angle - 360;
camera.setDisplayOrientation(angle);
camera.startPreview();// 开始预览
public void surfaceDestroyed(SurfaceHolder holder) {
camera.setPreviewCallback(null);
camera.stopPreview();
camera.release();
// private void data2file(byte[] w, String fileName) throws Exception {//
// 将二进制数据转换为文件的函数
// FileOutputStream out =
// out = new FileOutputStream(fileName);
// out.write(w);
// out.close();
// } catch (Exception e) {
// if (out != null)
// out.close();
public void DetectFace() {
Mat image = Highgui.imread(FACE);
MatOfRect faceDetections = new MatOfRect();
mJavaDetector.detectMultiScale(image, faceDetections);
int k = 0;
for (Rect rect : faceDetections.toArray()) {
Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x
+ rect.width, rect.y + rect.height), new Scalar(0, 255, 0));
// 把检测到的人脸重新定义大小后保存成文件
Mat sub = image.submat(rect);
Mat mat = new Mat();
Size size = new Size(100, 100);
Imgproc.resize(sub, mat, size);
Highgui.imwrite(FACEDONE, mat);
if (k == 0) {
cu.writePhoto(BitmapFactory.decodeFile(FACE), 100, 100, FACEDONE);
public int Identification() {
FaceRecognizer fr = createFisherFaceRecognizer();
MatVector mv = new MatVector(faceList.size());
CvMat cvMat = CvMat.create(faceList.size(), 1, CV_32SC1);
for (int i = 0; i & faceList.size(); i++) {
IplImage img = cvLoadImage(faceList.get(i).getPath(),
CV_LOAD_IMAGE_GRAYSCALE);
mv.put(i, img);
cvMat.put(i, 0, i);
fr.train(mv, cvMat);
IplImage testImage = cvLoadImage(
Environment.getExternalStorageDirectory()
+ &/FaceDetect/faceDone.jpg&, CV_LOAD_IMAGE_GRAYSCALE);
return fr.predict(testImage);
public void LoadFaceData() {
File[] files = new File(&/sdcard/FaceData/&).listFiles();
faceList.clear();
for (int i = 0; i & files. i++) {
f = files[i];
if (!f.canRead()) {
if (f.isFile()) {
id = f.getName().split(&_&)[0];
name = f.getName().substring(f.getName().indexOf(&_&) + 1,
f.getName().length() - 4);
faceList.add(new FacePojo(id, name, Environment
.getExternalStorageDirectory()
+ &/FaceData/&
+ f.getName()));
public double CmpPic(String path) {
int l_bins = 20;
int hist_size[] = { l_bins };
float v_ranges[] = { 0, 100 };
float ranges[][] = { v_ranges };
IplImage Image1 = cvLoadImage(Environment.getExternalStorageDirectory()
+ &/FaceDetect/faceDone.jpg&, CV_LOAD_IMAGE_GRAYSCALE);
IplImage Image2 = cvLoadImage(path, CV_LOAD_IMAGE_GRAYSCALE);
IplImage imageArr1[] = { Image1 };
IplImage imageArr2[] = { Image2 };
CvHistogram Histogram1 = CvHistogram.create(1, hist_size,
CV_HIST_ARRAY, ranges, 1);
CvHistogram Histogram2 = CvHistogram.create(1, hist_size,
CV_HIST_ARRAY, ranges, 1);
cvCalcHist(imageArr1, Histogram1, 0, null);
cvCalcHist(imageArr2, Histogram2, 0, null);
cvNormalizeHist(Histogram1, 100.0);
cvNormalizeHist(Histogram2, 100.0);
return cvCompareHist(Histogram1, Histogram2, CV_COMP_CORREL);
public void writePhoto(Bitmap bmp) {
File file = new File(&/sdcard/FaceDetect/faceDone.jpg&);
Bitmap bm = Bitmap.createBitmap(bmp, 0, 0, 100, 100);
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(file));
if (bm.pressFormat.JPEG, 100, bos)) {
bos.flush();
bos.close();
} catch (Exception e) {
e.printStackTrace();
public void timeDown() {
LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.custom,
(ViewGroup) findViewById(R.id.llToast));
ImageView image = (ImageView) layout.findViewById(R.id.tvImageToast);
image.setImageResource(iconArr[t--]);
toast = new Toast(getApplicationContext());
toast.setDuration(Toast.LENGTH_SHORT);
toast.setView(layout);
toast.show();
public int camera() {
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
cameraCount = Camera.getNumberOfCameras(); // get cameras number
for (int camIdx = 0; camIdx & cameraC camIdx++) {
Camera.getCameraInfo(camIdx, cameraInfo);
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
return camI
} catch (RuntimeException e) {
e.printStackTrace();
本文标题:
本页链接:javacv-cppjars怎么配置_百度知道
javacv-cppjars怎么配置
提问者采纳
我的是win7-32位系统,Java版本:jdk1.6.0_33Eclipse版本:Eclipse Java EE IDE for Web Developers. Version: Helios Service Release 2Build id: 1Visual Studio版本: 2010旗舰版1.
下载opencv(我用的版本是2.4.6.0)2.
双击opencv.x.x.exe安装,其实就是解压过程(注意:一定要把它解压到C盘根目录下,否则eclipse配置javacv的时候会失败)3.
然后在高级设置里面设置环境变量添加path:C:\opencv\build\x86\vc10\C:\opencv\build\java\x86;(第一个是为了vs2010设置的,第二个是为了eclipse设置的)4.
可以先在vs2010上测试opencv:新建工程-》打开属性管理器-》双击Debug|Win32下的Microsoft.Cpp.Win32.user-》VC++目录:(1)
在包含目录里面添加:C:\opencv\build\C:\opencv\build\include\C:\opencv\build\include\opencv2;(2)
在库目录里添加:C:\opencv\build\x86\vc10\库目录这里其实可以具体到highgui、core等库的。这样就不用在程序前面添加:#pragma comment(lib, &opencv_core246d.lib&)#pragma comment(lib, &opencv_highgui246d.lib&)用下面的代码来测试,图片可以随意用一张就行:#include &cv.h&#include &core\core.hpp&#include &highgui\highgui.hpp& #pragma comment(lib, &opencv_core246d.lib&)#pragma comment(lib, &opencv_highgui246d.lib&)
int main(){//cvtColor(frame,gray,CV_BGR2GRAY);
namedWindow(&show image&, WINDOW_AUTOSIZE);
Mat src = imread(&opencv.png&);
imshow(&show image&, src);
if (waitKey(0) == 27)
return 0;}运行结果显示图片,测试成功。
来自团队:
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁Getting an x86 version of JavaCV for Android - 推酷
Getting an x86 version of JavaCV for Android
is a wrapper of mainly OpenCV and ffmpeg libraries. While these libs are perfectly compatible with x86 flavor of Android, JavaCV doesn’t provide the build scripts nor it integrate the x86 binaries.
It doesn’t take much to compile the proper x86 versions of JavaCV packages, but if you’re in a hurry, here they are:
Now let’s look at what was needed to build these. You need the usual build tools (gcc, make…) as well as maven.
You first need to recompile cppjars:
Recompiling cppjars (OpenCV and ffmpeg)
You can easily do so by reusing the build scripts provided in the cppjars release package:
wget /files/javacv-0.7-cppjars.zip
unzip javacv-0.7-cppjars.zip
cd javacv-cppjars
///files/javacv-0.7-cppjars.zip
The build scripts for Android are:&
build_opencv-android-arm.sh
build_ffmpeg-android-arm.sh
. We need to create&&
build_opencv-android-x86.sh
build_ffmpeg-android-x86.sh
equivalents of these.
Start by copying these scripts, then in the -x86 version, replace :
arm-linux-androideabi-
i686-linux-android-
(toolchain binaries prefix)
arm-linux-androideabi-&
(toolchain)
-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mfpu=neon…
-mtune=atom -mssse3 -mfpmath=sse
&(compiler flags)
i686-linux
&suffixes by&
Don’t do this blindly – it will work better if you understand what you’re doing
In the end here is the content I have for&
build_ffmpeg-android-x86.sh
build_ffmpeg-android-x86.sh
ANDROID_BIN=$ANDROID_NDK/toolchains/x86-4.8/prebuilt/linux-x86_64/bin
ANDROID_ROOT=$ANDROID_NDK/platforms/android-14/arch-x86
tar -xjvf ffmpeg-$FFMPEG_VERSION.tar.bz2
mv ffmpeg-$FFMPEG_VERSION ffmpeg-$FFMPEG_VERSION-android-x86
cd ffmpeg-$FFMPEG_VERSION-android-x86
tar -xjvf ../last_stable_x264.tar.bz2
X264=`echo x264-snapshot-*`
./configure --enable-static --enable-pic --disable-cli --disable-opencl --cross-prefix=$ANDROID_BIN/i686-linux-android- --sysroot=$ANDROID_ROOT --host=i686-linux --extra-cflags=&-fpic -pipe -DANDROID -DNDEBUG -mtune=atom -mssse3 -ffast-math -mfpmath=sse -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300& --extra-ldflags=&-lm -lz -Wl,--no-undefined -Wl,-z,noexecstack&
patch -p1 & ../ffmpeg-$FFMPEG_VERSION-android-x86.patch
./configure --prefix=$ANDROID_NDK/../ --enable-shared --enable-gpl --enable-version3 --enable-libx264 \
--disable-static --disable-symver --disable-doc --disable-ffplay --disable-ffmpeg --disable-ffprobe --disable-ffserver --disable-encoders --disable-muxers --disable-devices --disable-demuxer=sbg --disable-demuxer=dts --disable-parser=dca --disable-decoder=dca --disable-decoder=svq3 --enable-network --enable-version3 --disable-amd3dnow --disable-amd3dnowext --disable-outdev=sdl\
--extra-cflags=&-I$X264& --extra-ldflags=&-L$X264& --enable-cross-compile --cc=$ANDROID_BIN/i686-linux-android-gcc --sysroot=$ANDROID_ROOT --target-os=linux --arch=x86 --cpu=i686 \
--enable-asm --enable-yasm --enable-pic --extra-cflags=&-DANDROID -DNDEBUG -fPIC -pipe -mtune=atom -mssse3 -ffast-math -mfpmath=sse& \
--extra-ldflags=&-lm -lz -Wl,--no-undefined -Wl,-z,noexecstack& --disable-stripping --disable-symver --disable-programs
LIBS=&libavcodec/libavcodec.so libavdevice/libavdevice.so libavfilter/libavfilter.so libavformat/libavformat.so libavutil/libavutil.so libpostproc/libpostproc.so libswresample/libswresample.so libswscale/libswscale.so&
$ANDROID_NDK/toolchains/x86-4.8/prebuilt/linux-x86_64/bin/i686-linux-android-strip $LIBS
mkdir -p com/googlecode/javacv/cpp/android-x86/
cp $LIBS com/googlecode/javacv/cpp/android-x86/
jar cvf ../ffmpeg-$FFMPEG_VERSION-android-x86.jar com/
rm -Rf com/
ANDROID_BIN
$ANDROID_NDK
toolchains
ANDROID_ROOT
$ANDROID_NDK
$FFMPEG_VERSION
$FFMPEG_VERSION
$FFMPEG_VERSION
$FFMPEG_VERSION
last_stable_x264
$ANDROID_BIN
$ANDROID_ROOT
&-fpic -pipe -DANDROID -DNDEBUG -mtune=atom -mssse3 -ffast-math -mfpmath=sse -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300&
&-lm -lz -Wl,--no-undefined -Wl,-z,noexecstack&
$FFMPEG_VERSION
$ANDROID_NDK
amd3dnowext
$ANDROID_BIN
$ANDROID_ROOT
&-DANDROID -DNDEBUG -fPIC -pipe -mtune=atom -mssse3 -ffast-math -mfpmath=sse&
&-lm -lz -Wl,--no-undefined -Wl,-z,noexecstack&
&libavcodec/libavcodec.so libavdevice/libavdevice.so libavfilter/libavfilter.so libavformat/libavformat.so libavutil/libavutil.so libpostproc/libpostproc.so libswresample/libswresample.so libswscale/libswscale.so&
$ANDROID_NDK
toolchains
googlecode
googlecode
$FFMPEG_VERSION
ffmpeg-$FFMPEG_VERSION-android-x86.patch
is exactly the same as the arm one, you can cp it.
&build_opencv-android-x86.sh
build_opencv-android-x86.sh
tar -xzvf opencv-$OPENCV_VERSION.tar.gz
mkdir opencv-$OPENCV_VERSION/build_android-x86
cd opencv-$OPENCV_VERSION
cd build_android-x86
ANDROID_BIN=$ANDROID_NDK/toolchains/x86-4.6/prebuilt/linux-x86_64/bin/ \
ANDROID_CPP=$ANDROID_NDK/sources/cxx-stl/gnu-libstdc++/4.6/ \
ANDROID_ROOT=$ANDROID_NDK/platforms/android-9/arch-x86/ \
cmake -DCMAKE_TOOLCHAIN_FILE=platforms/android/android.toolchain.cmake -DANDROID_ABI=x86 -DOPENCV_EXTRA_C_FLAGS=&-O3 -ffast-math -mtune=atom -mssse3 -mfpmath=sse& -DOPENCV_EXTRA_CXX_FLAGS=&-O3 -ffast-math -mtune=atom -mssse3 -mfpmath=sse& -DCMAKE_INSTALL_PREFIX=$ANDROID_NDK/../ -DBUILD_SHARED_LIBS=ON -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_ANDROID_EXAMPLES=OFF -DBUILD_JASPER=ON -DBUILD_JPEG=ON -DBUILD_OPENEXR=ON -DBUILD_PNG=ON -DBUILD_TBB=ON -DBUILD_TIFF=ON -DBUILD_ZLIB=ON -DBUILD_opencv_java=OFF -DBUILD_opencv_python=OFF -DENABLE_PRECOMPILED_HEADERS=OFF -DWITH_1394=OFF -DWITH_FFMPEG=OFF -DWITH_GSTREAMER=OFF -DWITH_TBB=ON -DWITH_CUDA=OFF -DWITH_OPENCL=OFF ..
LIBS=&lib/x86/libopencv*.so lib/x86/libtbb.so&
$ANDROID_NDK/toolchains/x86-4.6/prebuilt/linux-x86_64/bin/i686-linux-android-strip $LIBS
mkdir -p com/googlecode/javacv/cpp/android-x86/
cp $LIBS com/googlecode/javacv/cpp/android-x86/
jar cvf ../../opencv-$OPENCV_VERSION-android-x86.jar com/
rm -Rf com/
$OPENCV_VERSION
$OPENCV_VERSION
build_android
$OPENCV_VERSION
build_android
ANDROID_BIN
$ANDROID_NDK
toolchains
ANDROID_CPP
$ANDROID_NDK
ANDROID_ROOT
$ANDROID_NDK
DCMAKE_TOOLCHAIN_FILE
.toolchain
DANDROID_ABI
DOPENCV_EXTRA_C_FLAGS
&-O3 -ffast-math -mtune=atom -mssse3 -mfpmath=sse&
DOPENCV_EXTRA_CXX_FLAGS
&-O3 -ffast-math -mtune=atom -mssse3 -mfpmath=sse&
DCMAKE_INSTALL_PREFIX
$ANDROID_NDK
DBUILD_SHARED_LIBS
DBUILD_TESTS
DBUILD_PERF_TESTS
DBUILD_ANDROID_EXAMPLES
DBUILD_JASPER
DBUILD_JPEG
DBUILD_OPENEXR
DBUILD_PNG
DBUILD_TBB
DBUILD_TIFF
DBUILD_ZLIB
DBUILD_opencv_java
DBUILD_opencv_python
DENABLE_PRECOMPILED_HEADERS
DWITH_1394
DWITH_FFMPEG
DWITH_GSTREAMER
DWITH_CUDA
DWITH_OPENCL
&lib/x86/libopencv*.so lib/x86/libtbb.so&
$ANDROID_NDK
toolchains
googlecode
googlecode
$OPENCV_VERSION
Here I have deleted the call to the -arm patch that was generating another android.mk file to directly rely on &
platforms/android/android.toolchain.cmake
that is provided by
and I’ve also added specific flags to get more optimization:
-DANDROID_ABI=x86 -DOPENCV_EXTRA_C_FLAGS=&-O3 -ffast-math -mtune=atom -mssse3 -mfpmath=sse& -DOPENCV_EXTRA_CXX_FLAGS=&-O3 -ffast-math -mtune=atom -mssse3 -mfpmath=sse&
DANDROID_ABI
DOPENCV_EXTRA_C_FLAGS
&-O3 -ffast-math -mtune=atom -mssse3 -mfpmath=sse&
DOPENCV_EXTRA_CXX_FLAGS
&-O3 -ffast-math -mtune=atom -mssse3 -mfpmath=sse&
&Now if you call:
sh ./build_all.sh android-x86
This will generate you&
ffmpeg-2.1.1-android-x86.jar
opencv-2.4.8-android-x86.jar
Now you can finally build the JavaCV package:
Packaging x86 version of JavaCV
First retrieve and install JavaCPP:
git clone /p/javacpp/
cd javacpp/
git checkout 0.6
mvn install
///p/javacpp/
Once its done, retrieve JavaCV source code:
git clone /p/javacv/
git checkout 0.7
///p/javacv/
&You can now package the android-x86 version of
&by setting the
android-x86
property to
mvn package -Pffmpeg -Djavacpp.options=&-properties android-x86 -Dplatform.root=$ANDROID_NDK -Dcompiler.path=$ANDROID_NDK/toolchains/x86-4.6/prebuilt/linux-x86_64/bin/i686-linux-android-g++ -Dcompiler.includepath=$ANDROID_NDK/sources/cxx-stl/gnu-libstdc++/4.6/include\
:$ANDROID_NDK/sources/cxx-stl/gnu-libstdc++/4.6/libs/x86/include\
:../javacv-cppjars/opencv-2.4.8/build_android-x86/\
:../javacv-cppjars/opencv-2.4.8/modules/core/include\
:../javacv-cppjars/opencv-2.4.8/modules/androidcamera/include\
:../javacv-cppjars/opencv-2.4.8/modules/flann/include\
:../javacv-cppjars/opencv-2.4.8/modules/imgproc/include\
:../javacv-cppjars/opencv-2.4.8/modules/highgui/include\
:../javacv-cppjars/opencv-2.4.8/modules/features2d/include\
:../javacv-cppjars/opencv-2.4.8/modules/calib3d/include\
:../javacv-cppjars/opencv-2.4.8/modules/ml/include\
:../javacv-cppjars/opencv-2.4.8/modules/video/include\
:../javacv-cppjars/opencv-2.4.8/modules/legacy/include\
:../javacv-cppjars/opencv-2.4.8/modules/objdetect/include\
:../javacv-cppjars/opencv-2.4.8/modules/photo/include\
:../javacv-cppjars/opencv-2.4.8/modules/gpu/include\
:../javacv-cppjars/opencv-2.4.8/modules/nonfree/include\
:../javacv-cppjars/opencv-2.4.8/modules/contrib/include\
:../javacv-cppjars/opencv-2.4.8/modules/stitching/include\
:../javacv-cppjars/opencv-2.4.8/modules/ts/include\
:../javacv-cppjars/opencv-2.4.8/modules/videostab/include\
:../javacv-cppjars/ffmpeg-2.1.1-android-x86 \
-Dcompiler.linkpath=$ANDROID_NDK/sources/cxx-stl/gnu-libstdc++/4.6/libs/x86\
:../javacv-cppjars/opencv-2.4.8/build_android-x86/lib/x86\
:../javacv-cppjars/ffmpeg-2.1.1-android-x86/libswscale\
:../javacv-cppjars/ffmpeg-2.1.1-android-x86/libavcodec\
:../javacv-cppjars/ffmpeg-2.1.1-android-x86/libswresample\
:../javacv-cppjars/ffmpeg-2.1.1-android-x86/libpostproc\
:../javacv-cppjars/ffmpeg-2.1.1-android-x86/libavfilter\
:../javacv-cppjars/ffmpeg-2.1.1-android-x86/libavformat\
:../javacv-cppjars/ffmpeg-2.1.1-android-x86/libavutil\
:../javacv-cppjars/ffmpeg-2.1.1-android-x86/libavdevice&
properties
$ANDROID_NDK
$ANDROID_NDK
toolchains
.includepath
$ANDROID_NDK
$ANDROID_NDK
build_android
androidcamera
features2d
$ANDROID_NDK
build_android
libswscale
libavcodec
libswresample
libpostproc
libavfilter
libavformat
libavdevice
You’ll get your packages in
2.7M Jan 15 19:09 javacv-android-x86.jar
3.6M Jan 15 19:09 javacv-bin.zip
747K Jan 15 19:09 javacv-src.zip
734K Jan 15 19:09 javacv.jar
Adding this x86 version to your app
From the packages I gave at the beginning of this article or from what you’ve just built, you can now copy thegenerated .so filesthat are inside&
javacv-android-x86.jar
ffmpeg-2.1.1-android-x86.jar
opencv-2.4.8-android-x86.jar
folder of your Android package, the same way as the arm versions inside&
/lib/armeabi-v7a/
To get more information on how to deal with .so files and APKs, please refer to these two previous articles:
已发表评论数()
&&登&&&录&&
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见

我要回帖

更多关于 javacv android demo 的文章

 

随机推荐