首页 文章 精选 留言 我的

精选列表

搜索[学习],共10000篇文章
优秀的个人博客,低调大师

译是如何把深度学习“塞进”手机的?

导读:前几天谷歌更新了它们的翻译App,其中最大的提升了是“字镜头”实时视频翻译和通话实时翻译。怎么做到的?字镜头技术首创者、Google 研究院翻译项目组资深软件工程师Otavio Good近日在博客上详述了相关原理。 前几天谷歌更新了它们的翻译App,该版本有诸多提升的地方,其中最大的是提升了所谓“字镜头”实时视频翻译性能和通话实时翻译性能。怎么提升的呢?字镜头技术首创者、Google 研究院翻译项目组资深软件工程师Otavio Good近日在Google Research Blog详述了相关原理。 正文部分如下: 今天(2015年7月29日),我们发布了Google翻译手机App,现在这款App可支持20多种语言的即时视觉翻译(Visual Translation),也就是说,您可拿着手机摄像头对着实物,实物中的文字就可被即时识别

优秀的个人博客,低调大师

OpenCV学习笔记(七)—— OpenCV for Android实时图像处理

在上篇中我们已经实现了相机打开和实时图像信息的获取,那么接下来我们可以尝试在获取的图像信息进行一些处理,然后实时显示出来,在这里我们要完成的的几种处理: 灰化、Canny边缘检测、Hist直方图计算、Sobel边缘检测、SEPIA(色调变换)、ZOOM放大镜、PIXELIZE像素化 一、修改布局界面: 由于这里我们需要切换不同的图像处理模式,所以这里我们需要在界面上放置一个按钮,我们可以放置很多个按钮,每个按钮对应一种处理模式,但是这里我们也可以只放置一个按钮,每次点击按钮就切换一次,循环切换模式: activity_main.xml文件: [java] view plain copy print ? <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:opencv="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <org.opencv.android.JavaCameraView android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/camera_view" opencv:show_fps="true" opencv:camera_id="any"/> <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="bottom|center_horizontal"> <Button android:id="@+id/deal_btn" android:layout_width="100dp" android:layout_height="40dp" android:layout_marginBottom="20dp" android:text="处理"/> </RelativeLayout> </FrameLayout> 查看预览图: 二、获取按钮组件并监听按钮点击: 1.声明一个Button对象用于绑定上面的按钮组件和一个状态标志位用于存储当前状态: [java] view plain copy print ? //按钮组件 privateButtonmButton; //当前处理状态 privatestaticintCur_State=0; 2.在OnCreate中绑定按钮和按钮点击监听: [java] view plain copy print ? mButton=(Button)findViewById(R.id.deal_btn); mButton.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ if(Cur_State<8){ //切换状态 Cur_State++; }else{ //恢复初始状态 Cur_State=0; } } }); 这里的状态标志位Cur_State与图像处理的每个类型对应,0对应默认状态,也就是显示原图,1-7分别对应: 灰化、Canny边缘检测、Hist直方图计算、Sobel边缘检测、SEPIA(色调变换)、ZOOM放大镜、PIXELIZE像素化 三、图像信息获取保存、处理和显示: 1.在OpenCV中一般都是使用Mat类型来存储图像等矩阵信息,所以我们可以声明一个Mat对象用来作为实时帧图像的缓存对象: [java] view plain copy print ? //缓存相机每帧输入的数据 privateMatmRgba; 2.对象实例化以及基本属性的设置,包括:长度、宽度和图像类型标志: [java] view plain copy print ? publicvoidonCameraViewStarted(intwidth,intheight){ //TODOAuto-generatedmethodstub mRgba=newMat(height,width,CvType.CV_8UC4); } 3.对象赋值,这里只对原图和灰化两种情况进行了处理,其他的处理后续再添加: [java] view plain copy print ? /** *图像处理都写在此处 */ @Override publicMatonCameraFrame(CvCameraViewFrameinputFrame){ switch(Cur_State){ case1: //灰化处理 Imgproc.cvtColor(inputFrame.gray(),mRgba,Imgproc.COLOR_GRAY2RGBA,4); break; default: //显示原图 mRgba=inputFrame.rgba(); break; } //返回处理后的结果数据 returnmRgba; } 4.由于用对象存储图像数据的话,数据会保存到内存中,所以结束的时候需要进行数据释放,不然可能导致崩溃: [java] view plain copy print ? @Override publicvoidonCameraViewStopped(){ //TODOAuto-generatedmethodstub mRgba.release(); } 5.运行查看效果: 正常模式: 灰化图: 四、其他处理及结果: 在以上的例子中我们已经完成了预览图的灰化处理,那么接下来我们把其他处理都添加到代码中,查看效果。由于在2.x版本中使用到的部分方法已经发生了变化,如:在OpenCV 3.1.0中org.opencv.core.Core类中的方法line和rectangle都已失效,可以用org.opencv.imgproc.Imgproc中的line和rectangle来代替: 1.MainActivity.Java源码: [java] view plain copy print ? packagecom.linsh.opencv_test; importjava.util.Arrays; importorg.opencv.android.BaseLoaderCallback; importorg.opencv.android.CameraBridgeViewBase; importorg.opencv.android.OpenCVLoader; importorg.opencv.android.CameraBridgeViewBase.CvCameraViewFrame; importorg.opencv.android.CameraBridgeViewBase.CvCameraViewListener2; importorg.opencv.android.LoaderCallbackInterface; importorg.opencv.core.Core; importorg.opencv.core.CvType; importorg.opencv.core.Mat; importorg.opencv.core.MatOfFloat; importorg.opencv.core.MatOfInt; importorg.opencv.core.Point; importorg.opencv.core.Scalar; importorg.opencv.core.Size; importorg.opencv.imgproc.Imgproc; importandroid.R.string; importandroid.app.Activity; importandroid.os.Bundle; importandroid.util.Log; importandroid.widget.Button; importandroid.view.View; importandroid.view.View.OnClickListener; publicclassMainActivityextendsActivityimplementsCvCameraViewListener2{ privateStringTAG="OpenCV_Test"; //OpenCV的相机接口 privateCameraBridgeViewBasemCVCamera; //缓存相机每帧输入的数据 privateMatmRgba,mTmp; //按钮组件 privateButtonmButton; //当前处理状态 privatestaticintCur_State=0; privateSizemSize0; privateMatmIntermediateMat; privateMatOfIntmChannels[]; privateMatOfIntmHistSize; privateintmHistSizeNum=25; privateMatmMat0; privatefloat[]mBuff; privateMatOfFloatmRanges; privatePointmP1; privatePointmP2; privateScalarmColorsRGB[]; privateScalarmColorsHue[]; privateScalarmWhilte; privateMatmSepiaKernel; /** *通过OpenCV管理Android服务,异步初始化OpenCV */ BaseLoaderCallbackmLoaderCallback=newBaseLoaderCallback(this){ @Override publicvoidonManagerConnected(intstatus){ switch(status){ caseLoaderCallbackInterface.SUCCESS: Log.i(TAG,"OpenCVloadedsuccessfully"); mCVCamera.enableView(); break; default: break; } } }; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mCVCamera=(CameraBridgeViewBase)findViewById(R.id.camera_view); mCVCamera.setCvCameraViewListener(this); mButton=(Button)findViewById(R.id.deal_btn); mButton.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ if(Cur_State<8){ //切换状态 Cur_State++; }else{ //恢复初始状态 Cur_State=0; } } }); } @Override publicvoidonResume(){ super.onResume(); if(!OpenCVLoader.initDebug()){ Log.d(TAG,"OpenCVlibrarynotfound!"); }else{ Log.d(TAG,"OpenCVlibraryfoundinsidepackage.Usingit!"); mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS); } }; @Override publicvoidonDestroy(){ if(mCVCamera!=null){ mCVCamera.disableView(); } }; @Override publicvoidonCameraViewStarted(intwidth,intheight){ //TODOAuto-generatedmethodstub mRgba=newMat(height,width,CvType.CV_8UC4); mTmp=newMat(height,width,CvType.CV_8UC4); mIntermediateMat=newMat(); mSize0=newSize(); mChannels=newMatOfInt[]{newMatOfInt(0),newMatOfInt(1),newMatOfInt(2)}; mBuff=newfloat[mHistSizeNum]; mHistSize=newMatOfInt(mHistSizeNum); mRanges=newMatOfFloat(0f,256f); mMat0=newMat(); mColorsRGB=newScalar[]{newScalar(200,0,0,255),newScalar(0,200,0,255),newScalar(0,0,200,255)}; mColorsHue=newScalar[]{ newScalar(255,0,0,255),newScalar(255,60,0,255),newScalar(255,120,0,255),newScalar(255,180,0,255),newScalar(255,240,0,255), newScalar(215,213,0,255),newScalar(150,255,0,255),newScalar(85,255,0,255),newScalar(20,255,0,255),newScalar(0,255,30,255), newScalar(0,255,85,255),newScalar(0,255,150,255),newScalar(0,255,215,255),newScalar(0,234,255,255),newScalar(0,170,255,255), newScalar(0,120,255,255),newScalar(0,60,255,255),newScalar(0,0,255,255),newScalar(64,0,255,255),newScalar(120,0,255,255), newScalar(180,0,255,255),newScalar(255,0,255,255),newScalar(255,0,215,255),newScalar(255,0,85,255),newScalar(255,0,0,255) }; mWhilte=Scalar.all(255); mP1=newPoint(); mP2=newPoint(); //Fillsepiakernel mSepiaKernel=newMat(4,4,CvType.CV_32F); mSepiaKernel.put(0,0,/*R*/0.189f,0.769f,0.393f,0f); mSepiaKernel.put(1,0,/*G*/0.168f,0.686f,0.349f,0f); mSepiaKernel.put(2,0,/*B*/0.131f,0.534f,0.272f,0f); mSepiaKernel.put(3,0,/*A*/0.000f,0.000f,0.000f,1f); } @Override publicvoidonCameraViewStopped(){ //TODOAuto-generatedmethodstub mRgba.release(); mTmp.release(); } /** *图像处理都写在此处 */ @Override publicMatonCameraFrame(CvCameraViewFrameinputFrame){ mRgba=inputFrame.rgba(); SizesizeRgba=mRgba.size(); introws=(int)sizeRgba.height; intcols=(int)sizeRgba.width; MatrgbaInnerWindow; intleft=cols/8; inttop=rows/8; intwidth=cols*3/4; intheight=rows*3/4; switch(Cur_State){ case1: //灰化处理 Imgproc.cvtColor(inputFrame.gray(),mRgba,Imgproc.COLOR_GRAY2RGBA,4); break; case2: //Canny边缘检测 mRgba=inputFrame.rgba(); Imgproc.Canny(inputFrame.gray(),mTmp,80,100); Imgproc.cvtColor(mTmp,mRgba,Imgproc.COLOR_GRAY2RGBA,4); break; case3: //Hist直方图计算 Mathist=newMat(); intthikness=(int)(sizeRgba.width/(mHistSizeNum+10)/5); if(thikness>5)thikness=5; intoffset=(int)((sizeRgba.width-(5*mHistSizeNum+4*10)*thikness)/2); //RGB for(intc=0;c<3;c++){ Imgproc.calcHist(Arrays.asList(mRgba),mChannels[c],mMat0,hist,mHistSize,mRanges); Core.normalize(hist,hist,sizeRgba.height/2,0,Core.NORM_INF); hist.get(0,0,mBuff); for(inth=0;h<mHistSizeNum;h++){ mP1.x=mP2.x=offset+(c*(mHistSizeNum+10)+h)*thikness; mP1.y=sizeRgba.height-1; mP2.y=mP1.y-2-(int)mBuff[h]; Imgproc.line(mRgba,mP1,mP2,mColorsRGB[c],thikness); } } //ValueandHue Imgproc.cvtColor(mRgba,mTmp,Imgproc.COLOR_RGB2HSV_FULL); //Value Imgproc.calcHist(Arrays.asList(mTmp),mChannels[2],mMat0,hist,mHistSize,mRanges); Core.normalize(hist,hist,sizeRgba.height/2,0,Core.NORM_INF); hist.get(0,0,mBuff); for(inth=0;h<mHistSizeNum;h++){ mP1.x=mP2.x=offset+(3*(mHistSizeNum+10)+h)*thikness; mP1.y=sizeRgba.height-1; mP2.y=mP1.y-2-(int)mBuff[h]; Imgproc.line(mRgba,mP1,mP2,mWhilte,thikness); } break; case4: //Sobel边缘检测 Matgray=inputFrame.gray(); MatgrayInnerWindow=gray.submat(top,top+height,left,left+width); rgbaInnerWindow=mRgba.submat(top,top+height,left,left+width); Imgproc.Sobel(grayInnerWindow,mIntermediateMat,CvType.CV_8U,1,1); Core.convertScaleAbs(mIntermediateMat,mIntermediateMat,10,0); Imgproc.cvtColor(mIntermediateMat,rgbaInnerWindow,Imgproc.COLOR_GRAY2BGRA,4); grayInnerWindow.release(); rgbaInnerWindow.release(); break; case5: //SEPIA(色调变换) rgbaInnerWindow=mRgba.submat(top,top+height,left,left+width); Core.transform(rgbaInnerWindow,rgbaInnerWindow,mSepiaKernel); rgbaInnerWindow.release(); break; case6: //ZOOM放大镜 MatzoomCorner=mRgba.submat(0,rows/2-rows/10,0,cols/2-cols/10); MatmZoomWindow=mRgba.submat(rows/2-9*rows/100,rows/2+9*rows/100,cols/2-9*cols/100,cols/2+9*cols/100); Imgproc.resize(mZoomWindow,zoomCorner,zoomCorner.size()); Sizewsize=mZoomWindow.size(); Imgproc.rectangle(mZoomWindow,newPoint(1,1),newPoint(wsize.width-2,wsize.height-2),newScalar(255,0,0,255),2); zoomCorner.release(); mZoomWindow.release(); break; case7: //PIXELIZE像素化 rgbaInnerWindow=mRgba.submat(top,top+height,left,left+width); Imgproc.resize(rgbaInnerWindow,mIntermediateMat,mSize0,0.1,0.1,Imgproc.INTER_NEAREST); Imgproc.resize(mIntermediateMat,rgbaInnerWindow,rgbaInnerWindow.size(),0.,0.,Imgproc.INTER_NEAREST); rgbaInnerWindow.release(); break; default: //显示原图 mRgba=inputFrame.rgba(); break; } //返回处理后的结果数据 returnmRgba; } } 2.效果图: Canny边缘检测: Hist直方图计算: Sobel边缘检测: SEPIA(色调变换): ZOOM放大镜: PIXELIZE像素化:

优秀的个人博客,低调大师

机器学习为您揭秘雾霾怎么形成

通过最佳实践帮助您实现上述案例效果 Step1:数据导入MaxCompute 1.1 创建需要上传的本地数据 北京天气指标表: 字段名 含义 类型 描述 time 日期 string 精确到天 hour 时间 string 表示的是时间,第几小时的数据 pm2 指标 string pm2.5的指标 pm10 指标 string pm10的指标 so2 指标 string 二氧化硫的指标 co 指标 string 一氧化碳的指标 no2 指标 string 二氧化氮的指标 源数据:wumai_data 1.2 创建MaxCompute表 1.2.1 开通MaxCompute 阿里云实名认证账号访

优秀的个人博客,低调大师

机器学习帮助您挖掘金融欺诈用户

通过最佳实践帮助您实现上述案例效果 Step1:数据导入MaxCompute 1.1 创建需要上传的本地数据 人员管理表: 字段名 含义 类型 描述 start_point 边的起始节点 string 人 end_point 边的结束节点 string 人 count 关系紧密度 double 数值越大,两人的关系越紧密 源数据:person 已知数据表: 字段名 含义 类型 描述 point 用户名 string 人 point_type 用户类型 string 类型 weight 信用指数 double 指数 源数据:point 1.2 创建MaxCompute表 1.2.1 开通MaxCompute 阿里

优秀的个人博客,低调大师

Android学习之ViewPager(一)——ViewPager的简单使用

版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/u013132758。 https://blog.csdn.net/u013132758/article/details/53187611 前言 前段时间一直在加班比较忙,做项目中遇到了ViewPager,发现自己对ViewPager还只是会简单的使用,一些功能还是不太会使用,于是详细阅读了ViewPager的源码。 想要学的更加彻底点。下面我将通过三篇文章来主要介绍ViewPager。 解析ViewPager(一)——ViewPager的简单使用 解析ViewPager(二)——ViewPager的源码解析 解析ViewPager(三)——ViewPager的深入使用 ViewPager的使用 效果图如下所示: 1、 首先我们在activity的布局文件中添加View Pager控件。如下所示: 2、其次我们新建几个布局文件用于ViewPager不同的页卡显示,这里只举例一个,后面几个雷同只是修改一下颜色和Text。 3、在Activity中实例化ViewPager并对它初始化,将不同布局加载在ViewPager中,使ViewPager分页显示: ViewPager的简单解析 1、首先我们将ViewPage从布局中获取到,然后如下所示我们将三个布局文件找到并添加到viewList中; 2、自定义PagerAdapter 自定义PagerAdapter必须重写以下四个方法(也可以写其他方法,但是这四个方法必须重写)。最后我们给ViewPager设置Adapter。 3、关于四个方法的简单解释: getCount():返回要滑动的VIew的个数 destroyItem():从当前container中删除指定位置(position)的View; instantiateItem():做了两件事,第一:将当前视图添加到container中,第二:返回当前View isViewFromObject():判断当前View和下一个View是否为同一个View 关于ViewPager的简单使用就先介绍到这,下一篇将解析VIewPager的源码。

优秀的个人博客,低调大师

docker学习(8) 在mac机上搭建私有仓库

docker的私有仓库类似maven的私服,一般用于公司内部搭建一个类似docker hub的环境,这样上传、下载镜像速度较快,本文将演示如何在mac上利用docker-machine搭建无需SSL证书的私有仓库。 一、查看docker-machine虚拟机IP docker-machine ip default 默认情况下docker-toolbox创建的虚拟机名称为default,如果您的虚拟机名字不是这个,上面命令最后的default换成真实的虚拟机名字,假设default分配的IP为192.168.99.100 二、修改虚拟机中的docker启动配置 由于docker最新版本默认访问私服时,强制采用SSL安全连接,但一般内部应用时不需要这么高的安全级别,参考下面的做法降低安全设置: docker-machine ssh default sudo vi /var/lib/boot2docker/profile 在profile文件最后加上: EXTRA_ARGS="--insecure-registry 192.168.99.100:5000" 然后exit退出default,输入以下命令重启虚拟机 docker-machine restart default 三、创建私服容器 dao pull registry docker run -d -p 5000:5000 --restart=always -h registry \ --name registry \ -v /Users/yjmyzz/data/registry:/tmp/registry \ registry 第1行的dao pull registry表示将从daocloud.io上拉取registry镜像,如果本机已经有该镜像,可以省略。 -v 后面的路径,大家改成实际路径,这个目录用于存放push到私有仓库的images文件。 四、测试上传、下载 4.1 先从daocloud.io上拉一个hello-world hello-world这个镜像只有960b,可以拿这个练手 dao pull hello-world 4.2 将hello-world打标签成私服镜像 docker tag hello-world 192.168.99.100:5000/hello-world 上面的ip要换真实的虚拟机ip,执行完以后,本机镜像文件应该能看到这个images,见下图: 注:原始镜像hello-world与打tag后的镜像具有相同的IMAGE ID,说明这二个镜像就是同一个,只是tag不同而已。 4.3 上传到私有仓库 docker push 192.168.99.100:5000/hello-world 顺利的话,应该很快就能上传完: ~ docker push 192.168.99.100:5000/hello-world The push refers to a repository [192.168.99.100:5000/hello-world] (len: 1) Sending image list Pushing repository 192.168.99.100:5000/hello-world (1 tags) 3f12c794407e: Image successfully pushed 975b84d108f1: Image successfully pushed Pushing tag for rev [975b84d108f1] on {http://192.168.99.100:5000/v1/repositories/hello-world/tags/latest} 可以直接在浏览器里访问:http://192.168.99.100:5000/v1/search,如果能看到 { "num_results": ​1, "query": "", "results": [ { "description": "", "name": "library/hello-world" } ] } 说明上传成功 4.4 从私有仓库下载 因为本机已经有hello-world的镜像了,为了方便验证,先把它删除: docker rmi -f hello-world 192.168.99.100:5000/hello-world #或 #docker rmi -f 975b84d108f1 #即:hello-world的IMAGE ID 然后下载: docker pull 192.168.99.100:5000/hello-world 内网环境,应该很快就能下载完成: ~ docker pull 192.168.99.100:5000/hello-world Using default tag: latest Pulling repository 192.168.99.100:5000/hello-world 975b84d108f1: Download complete 3f12c794407e: Download complete Status: Downloaded newer image for 192.168.99.100:5000/hello-world:latest 192.168.99.100:5000/hello-world: this image was pulled from a legacy registry. Important: This registry version will not be supported in future versions of docker. 注:如果私有仓库要放置在公网上,建议还是按官方推荐的做法,设置SSL证书,强制走https协议,否则将有安全风险。 参考文章:1. Docker私有Registry在CentOS6.X下安装指南 2. 搭建私有 Docker 仓库服务器 3. Use private docker registry in OS-X 4. Deploying a registry server 5. allow insecure registry in host provisioned with docker-machine 6. Adding trusted root certificates to the server 7. How To Set Up a Private Docker Registry on Ubuntu 14.04

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册