随着后续识别拍摄柜台的电话



简介 H4>恰巧我住的是平房,没有集中供暖,因此每个温暖我的公寓自己。最常用于此目的的燃气锅炉,该方法是够便宜,没什么可抱怨的,但有一个细微之处。对于燃气锅炉(突然)的正确操作,必须具有气体在管。

也许是因为不是所有的行为锅炉,但我们的关断,即使在短期中断供气和不折回,如果恢复供电。如果有人有一个家,这是没有问题的,按下按钮和锅炉加热进一步,但如果它发生得太突然了,我们决定为家人去度假,和院子里的冬天,这么好,这么-20°C,那么后果可能是非常可怕的。

解决的办法很简单 - 将钥匙留在亲戚/朋友/邻居,这样他们就可以进来,打开锅炉会有任何麻烦。好吧,如果有邻居谁也天天来检查,如果一切正常。如果不呢?或者他也决定去某个地方度周末?

所以,我决定建立奠定抄表的地方在互联网上,这样我就可以找到一个漫长的旅程随时随地定期检查煤气是否被浪费,如果你突然停止消费,然后急忙拨打亲戚/朋友/邻居(或任何人有我左键)来,然后单击。

当然,把一些简单的适应症上网后,我决定不停止那里搅浑本主题的第2部分更多的认可标志和图形表示对这个的。

第1部分:从仪表读数,并把他们在互联网上 H4>有必要提一提,有柜台在一个完全不同的性质,他们中的一些有特殊轮胎和接口自动清除的证据。如果你有这样的,那么接下来,可能无法读取。但我有一个很普通的没有这样的接口(至少我没找到,就可以了,难看)模型GALLUS四PSC。因此,它仍然是一个选项 - 视觉指示去除率。在网络提供现成的解决方案,但他们花费了大量的金钱,最重要的是,它不是体育运动,所以我们将尽一切自己。

我们需要什么? H5>对于从仪表读数,然后把这些读数到互联网,我们需要任何不必要的Andr​​oid智能手机。举例来说,我已经用于这些目的的,三星Galaxy S III(SCH-I535)。是的,也许并不是每个读者已经与第三银河周围打滚,但我们必须明白,对于智能手机的需求并没有那么大:
  • 它必须被加载
  • 应该摄像机
  • 应该工作的WiFi LI> UL>这一切,工作屏幕的存在,触摸屏,麦克风,扬声器等。不是必需的。这一事实大大降低了成本。

    有一个爱好买在ebay上不同的破手机,其中收集的工作,我很容易在他的zagashnike主板上发现了从SGS3不起作用麦克风(〜$ 10)和B / Y shnuyu摄像头(〜$ 10)和中国电池(〜 300R)。还用碎显示一帧中的电池安装到电路板上的便利。


    最初以为只管理主板和摄像头,但事实证明,即使连接到充电费不包括不带电池,所以只好再添加一个边框和电池。但是,在这种情况下,预算是30元左右,如果你使用的机器更容易SGS3,你可以逃脱,并在较小的数额。

    然而,这种解决方案也有缺点,没有触摸屏的智能手机,并且不进行调整,所以讨论一下究竟是怎么回事要解决这个问题,因为方便。

    机器设置 H5>我们从最坏的情况下启动。假设没有任何显示,无触摸屏,智能手机没有根,亚行调试被禁用,固件是未知的。

    复苏 H6> 警告! B>适用于三星Galaxy S III(SCH-I535),如果你有其他的智能手机,该步骤可能会有所不同进一步的说明。

    假定您熟悉概念,如亚洲开发银行,固件等。

    为了使智能手机在或多或少为我们所知的情况,开始排水BEG固件VRBMB1 这里使用<一HREF =“htt​​p://androidp1.ru/odin-fir​​mware-samsung/”>奥丁。我不会详细如何做到这一点形容,互联网是充满了关于如何使用奥丁欧姆的说明。奥丁在这种情况下还是不错的,他很容易在不使用智能手机的屏幕来工作,你只需要打开你的智能手机进入下载模式(VOL DOWN +主页+电源 - 按住几秒钟,然后卷起来,通过USB连接到帆板和所有其它业务奥丁-a)所示。

    奥丁后缝漏,电话启动系统,它从USB断开,然后取出电池,所以它被关闭。该操作应完成固件奥丁欧姆开始下一个动作与电源断开状态后,每次进行。

    接着缝CWM恢复和根的<一个href="http://www.droidviews.com/root-and-install-cwmtwrp-recovery-on-verizon-galaxy-s3-sch-i535-android-4-1-14-1-2/">инструкции.总之,这是因为:
  • 在奥丁闪烁的自定义butcheyn VRALEC.bootchain.tar.md5
奥丁缝制后<一HREF =“htt​​p://dh.st/qnB”> CWM恢复 一个CWM恢复缝制 SuperSU_Bootloader_FIXED.zip 。手册上说,你需要扔在SD卡的zip,但由于没有屏幕更容易通过侧向载荷来做到这一点:
转动身体保持VOL UP +主页+电源 - 保持几秒钟,然后又5秒加载,进入CWM​​恢复模式
。 通过键入控制台在Ubuntu中选中此<前级=“prettyprint”> <码> ADB设备代码> PRE>(身体本身必须由USB连接,并应安装ADB - <前级=“ prettyprint“> <密码>命令和apt-get安装Android的工具 - 亚行代码> PRE>):
&LT;代码级=&QUOT;庆典&QUOT;&GT;凶星@ lepeshka:〜附64cb5c59恢复和LT设备$ ADB设备清单; /码&GT;  PRE>如果你看到最后一行,则一切OK,点击设备上下卷,卷下,电源 - 开关ADB侧向载荷(至少在CWM指令的版本,它是从上面第二行),我们只能键入控制台的Ubuntu:
&LT;代码级=&QUOT;庆典&QUOT;&GT;凶星@ lepeshka:〜$ ADB侧向载荷SuperSU_Bootloader_FIXED.zip发送:“侧向载荷'100%LT; /码&GT;  PRE>和根苍蝇在设备上,之后不再记住要关闭手机,取出电池。 
奥丁后闪对应的引流管 VRBMB1_Bootchain.tar.md5 <的设立股票butcheyn / A> LI> UL>
 接下来,我们需要在手机上启用USB调试,这款智能手机推出的模式CWM恢复,请检查:
&LT;代码级=&QUOT;庆典&QUOT;&GT;凶星@ lepeshka:〜附64cb5c59恢复&LT设备$ ADB设备清单; /码&GT;  PRE>坐骑系统:
&LT;代码级=&QUOT;庆典&QUOT;&GT;凶星@ lepeshka:〜$亚行的shell安装-o RW -t ext4的/dev/block/platform/msm_sdcc.1/by-name/system /系统&LT; /代码&GT;  PRE>添加线/system/build.prop:
&LT;代码级=&QUOT;庆典&QUOT;&GT;凶星@ lepeshka:〜$ ADB壳QUOT;回声\&QUOT; persist.service.adb.enable = 1 \&QUOT; &亿吨;&GT; /system/build.prop" &中尉; /码&GT;  PRE>重新启动:
&LT;代码级=&QUOT;庆典&QUOT;&GT;凶星@ lepeshka:〜$ ADB重启&LT; /码&GT;  PRE>我们正在等待装载,检查终端ADB的状态:
&LT;代码级=&QUOT;庆典&QUOT;&GT;凶星@ lepeshka:〜设备$ ADB设备名单附后64cb5c59设备&lt; /码&GT;  PRE>宾果!调试,让我们看看我们有你的手机上延续了该运行<一href="http://androidscreencast.googlecode.com/svn/trunk/AndroidScreencast/dist/androidscreencast.jnlp">AndroidScreenCast
使用Java Web Start和看:


该屏幕激活simkarty Verizon公司,我没有SIM卡,所以我就跳过激活,作用上的说明:
<大段引用>在选择屏幕中的语言始终触摸屏左下角(上述紧急呼叫),右下角,左下角,右下角,音量+ BLOCKQUOTE>即:
&LT;代码级=&QUOT;庆典&QUOT;&GT;凶星@ lepeshka:〜$亚行的shell输入抽头1150年10月凶星@ lepeshka:〜$亚行的shell输入抽头710 1150凶星@ lepeshka:〜$亚行的shell输入抽头1150年10月凶星@ lepeshka:〜$亚行的shell输入抽头710 1150&LT; /码&GT;  PRE>然后按智能手机上的VOL UP键,现在看到:


把一个复选标记,然后单击OK:
&LT;代码级=&QUOT;庆典&QUOT;&GT;凶星@ lepeshka:〜$亚行的shell输入抽头50600凶星@ lepeshka:〜$亚行的shell输入抽头650 600℃/码&GT;  PRE>  

Svaypaem解锁屏幕:
&LT;代码级=&QUOT;庆典&QUOT;&GT;凶星@ lepeshka:〜$亚行的shell输入刷卡100 100 500 100℃/码&GT;  PRE>  

现在,你需要把一些VNC服务器为Android,例如,的Andr​​oid VNC服务器。在智能手机上安装它:
&LT;代码级=&QUOT;庆典&QUOT;&GT;凶星@ lepeshka:〜$ ADB安装机器人+ VNC +服务器+ v1.1RC0.apk 4055 KB /秒(在0.501s 2084419字节)封装:/ data / local目录/tmp/droid+VNC+server+v1.1RC0.apk成功&LT; /码&GT;  PRE>我们清醒的智能手机,因为它容易入睡,直到我们安装VNC服务器和svaypaem,即解锁屏幕:
&LT;代码级=&QUOT;庆典&QUOT;&GT;凶星@ lepeshka:〜$亚行的shell输入的keyEvent 26凶星@ lepeshka:〜$亚行的shell输入刷卡100 100 500 100℃/码&GT;  PRE>运行VNC -server:
&LT;代码级=&QUOT;庆典&QUOT;&GT;凶星@ lepeshka:〜$亚行的shell时开始-a -n android.intent.action.Main org.onaips.vnc / .MainActivity&LT; /码&GT;  PRE>  

单击OK:
&LT;代码级=&QUOT;庆典&QUOT;&GT;凶星@ lepeshka:〜$亚行的shell输入抽头50900&LT; /码&GT;  PRE>  

单击开始:
&LT;代码级=&QUOT;庆典&QUOT;&GT;凶星@ lepeshka:〜$亚行的shell输入抽头350 300℃/码&GT;  PRE>  

点击授予访问权限:
&LT;代码级=&QUOT;庆典&QUOT;&GT;凶星@ lepeshka:〜$亚行的shell输入抽头600 1000 LT; /码&GT;  PRE>  

好了,现在是通过亚行转发端口:
&LT;代码级=&QUOT;庆典&QUOT;&GT;凶星@ lepeshka:〜$ ADB向前TCP:5801 TCP:5801凶星@ lepeshka:〜$ ADB向前TCP:5901 TCP:5901&LT; /码&GT; 预>并通过在智能手机上,或者你最喜欢的VNC客户端的浏览器。


进一步工作,作为一个常规的Andr​​oid手机,只通过一台计算机,它是方便的,以建立WiFi连接,那么我们就可以通过WiFi下去的VNC,但不是所有的时间,以保持与计算机连接的手机(后燃气表不总是位于计算机的附近)。

现在,当与设备的交互完全建立起来,就可以进行在互联网上配置摄影和发布数据。

定期拍摄 H6>安装应用程序塔斯克,以00:00的时间配置文件中创建它至23:59每30分钟执行一个动作 - 做照片。拍摄选项中,选择最合适的位置安装电话和柜台。我有这个宏的强制性闪光灯。

就是这样,实际上,我把我的手机(顶视图):


纸箱用绳子捆绑到柜台,它是家庭对智能手机,包装鸡蛋没有固定在垂直位置您的智能手机。然后,我更精致的设计,用胶带和纸板的闪光灯不直接打入脸,给人一种严重的眩光,防止认可。在所有封闭的盖子,里面顶部一片漆黑,或在明亮的环境光并不总是正确的自动对焦工作。

在媒体开发智能手机的设置一定要放一个复选标记的智能手机并没有在所连接的充电入睡,然后在某个时刻,他停下来拍照且仅当它继续打扰。


在网络 H6>蔓延到移动柜台拍摄的图像在互联网上,我用的第一个可用的应用程序 - 的 FolderSync精简版。它能够与智能手机,如谷歌驱动器的文件夹同步的文件夹。

因此,我现在可以在世界上有互联网接入的任何地方,去你的谷歌驱动器,并确认燃气锅炉运行正常。

第2部分:检测标志 H4>因此,发送抄表互联网上之后,我开始关注自动识别证据的可能性。这将允许:

来进行用气量 (通过e-mail或短信报警)自动跟踪天然气短缺 LI> UL>
的统计分析  作为开发语言选择蟒蛇,成像利用图书馆 OpenCV的

这里是主程序,它是由所述冠一小时一次运行的代码如下:
&LT;代码级=&QUOT;蟒蛇&QUOT;&GT;从车型导入SYS进口OS导入的getImage,来自GDrive的进口getImagesFromGDrive SESS,createImageFromGDriveObject如果__name__ =='__main__':#获得来自谷歌磁盘映像的新照片列表,HTTP = getImagesFromGDrive()#交替处理他们的img_info图像中一个循环:#下载图片的img = createImageFromGDriveObject(img_info,HTTP)FILE_NAME = img_info ['标题']#查找在数据库试项:数据库图像=的getImage(os.path.basename( FILE_NAME))dbimage.img = IMG dbimage.download_url = img_info [&QUOT; downloadUrl&QUOT] dbimage.img_link = img_info ['webContentLink']替换('&安培;出口=下载',''),除了ValueError错误为E:打印E继续#识别标志dbimage.identifyDigits()#保存数据到数据库sess.commit()&LT; /码&GT;  PRE>它使用功能代码,我会发布如下:
 <密码> getImagesFromGDrive 代码>  PRE>  - 一个函数,返回的没有从谷歌驱动器 
 <密码> createImageFromGDriveObject 代码>  PRE>  - 功能,下载图像本身,并把它转换成一种格式的OpenCV  
 <密码>的getImage 代码>  PRE>  - 用于在数据库中的图像记录功能的搜索,如果没有,那么创建它 
 <密码> identifyDigits 代码>  PRE>  - 方法认识见证这个图片 
 <代码> HTTP 代码>  PRE>  - 授权客户端来访问谷歌驱动器,详细了解访问API的磁盘读< A HREF =“htt​​ps://developers.google.com/drive/web/quickstart/quickstart-python”>这里  
 <密码> SESS < /代码>  PRE>  - 使用该库 SQL炼金术  LI>  UL> 
Connection对象到数据库与谷歌驱动器正在工作 H5>我们做的第一件事是与谷歌驱动器映像列表获得:
&LT;代码级=&QUOT;蟒蛇&QUOT;&GT;从日期时间进口tzinfo,timedelta,日期从从型号apiclient.discovery进口构建dateutil.relativedelta进口relativedelta进口OS导入getLastRecognizedImage高清getImagesFromGDrive():#定义的ID文件夹谷歌光盘在图像FOLDER_ID ='0B5mI3ROgk0mJcHJKTm95Ri1mbVU'#创建授权客户端的HTTP = getAuthorizedHttp()#服务对象光盘drive_service =构建(车程','V2',HTTP = HTTP)#,开始从对所有的磁盘映像中删除对象本月,我们不再感兴趣month_ago = date.today()+ relativedelta(月= -1)Q =&QUOT;'%s'的家长和MIMETYPE ='为image / jpeg',并捣毁=虚假和modifiedDate&LT;'%S '&QUOT; %(FOLDER_ID,month_ago.isoformat())文件= drive_service.files()名单(Q = Q,maxResults = 1000).execute()图像的files.get(“项目”):drive_service.files()。垃圾桶(FILEID =图像['身份证'])的execute()#现在做数据库查询,返回最后一个识别图像last_image = getLastRecognizedImage()#得到一个列表,从磁盘映像,修改日期大于记录的最后一个识别图像PAGE_SIZE = 1000的日期结果= [] PT =无#由于驱动器API不允许的时间获得超过1000张,#然后通过页面列表页面下载到1000,并增加了,而真正的单一阵列中:Q =&QUOT;在父母'%s'和丢弃=虚假和MIMETYPE ='为image / jpeg'和modifiedDate&GT;'%s'的&QUOT; %(FOLDER_ID,last_image.check_time.replace(tzinfo TZ =())。Isoformat(“T”))文件= drive_service.files()。表(Q = Q,maxResults = PAGE_SIZE,pageToken = PT).execute() result.extend(files.get(“项目”))PT = files.get('nextPageToken'),如果不点:突破#翻转列表,治疗的时间顺序拍摄result.reverse()返回结果,HTTP&LT; /代码&GT;  PRE>授权客户端磁盘创建如下:
&LT;代码级=&QUOT;蟒蛇&QUOT;&GT;进口httplib2的进口ConfigParser从oauth2client.client进口OAuth2WebServerFlow从oauth2client.file进口仓储高清getAuthorizedHttp():#我们得到的记录有CLIENT_ID config.ini文件和CLIENT_SECRET配置= ConfigParser .ConfigParser()config.read([os.path.dirname(__文件__)+'/ config.ini文件'])CLIENT_ID = config.get('GDrive的','CLIENT_ID')CLIENT_SECRET = config.get('GDrive的“, 'CLIENT_SECRET')#OAuth的将被授权的2.0范围内。 #查看https://developers.google.com/drive/scopes所有可用的范围。 OAUTH_SCOPE ='https://www.googleapis.com/auth/drive'#重定向的URI安装的应用程序REDIRECT_URI ='金塔:IETF:WG:OAuth的:2.0:OOB'#client_secrets.json文件将存储在存储令牌=存储(os.path.dirname(__ FILE__)+'/client_secrets.json')证书= storage.get()#如果没有在该文件中,然后运行该程序的授权,如果没有凭据:#执行OAuth2.0授权流程。流量= OAuth2WebServerFlow(CLIENT_ID,CLIENT_SECRET,OAUTH_SCOPE,REDIRECT_URI)authorize_url = flow.step1_get_authorize_url()#输出在控制台链接,有必要去检查打印“转到你的浏览器访问以下链接:”+ authorize_url#征求响应代码=进行raw_input('请输入验证码:').strip()凭证= flow.step2_exchange(代码)#保存令牌storage.put(凭证)#创建HTTP客户端和授权的HTTP =的httplib2.Http()credentials.authorize(HTTP)返回的HTTP&LT; /码&GT;  PRE>对于CLIENT_ID和CLIENT_SECRET在谷歌开发者控制台需要创建一个项目,并为此根据项目的原料药和AUTH  B>  -  证书 B>  -  的OAuth  B>点击创建新的客户端ID  B>,有选择安装应用 B>  -  其他 B>:


当你第一次运行写信给你想要去获得一个令牌,将其插入到你的浏览器URL中的主机的脚本,允许应用程序访问谷歌驱动器,由谷歌验证码从浏览器复制发行并给脚本。然后,该脚本将保留一切您需要的文件中的
 <代码> client_secrets.json 代码>  PRE>和后续运行也不会多问什么。

下载图像的功能是非常简单的:
&LT;代码级=&QUOT;蟒蛇&QUOT;&GT;进口CV2进口numpy的是NP高清downloadImageFromGDrive(downloadUrl,HTTP =无):如果HTTP ==无:HTTP = getAuthorizedHttp()#下载图片RESP,内容= HTTP。请求(downloadUrl)#创建图像对象的OpenCV img_array = np.asarray(字节组(内容),DTYPE = np.uint8)返回cv2.imdecode(img_array,cv2.IMREAD_COLOR)高清createImageFromGDriveObject(img_info,HTTP =无):返回downloadImageFromGDrive( img_info ['downloadUrl'],HTTP)和LT; /码&GT;  PRE> 
照片中搜索证词 H5>做后,我们拿到了照片的第一件事情,可以发现在它的数字,我们承认。这种方法确实<前级=“prettyprint”> <代码> extractDigitsFromImage 代码> PRE>:
&LT;代码级=&QUOT;蟒蛇&QUOT;&GT;高清extractDigitsFromImage(个体经营):IMG = self.img&LT; /码&GT;  PRE> 
原来的照片看起来像这样:


因此,首先我们把它收购所需的方向。
&LT;代码级=&QUOT;蟒蛇&QUOT;&GT; #是90度ħ旋转时,瓦特,K = img.shape M = cv2.getRotationMatrix2D((瓦特/ 2中,h / 2),270,1)的img = cv2.warpAffine(张图片,M(W,H)) &LT; /码&GT;  PRE> 


&LT;代码级=&QUOT;蟒蛇&QUOT;&GT; #裁剪黑场旋转的img =张图片后出现[0:小时,(WH)/ 2:小时+(WH)/ 2] h时,瓦特中,k = img.shape&LT; /代码&GT; 预> <登记/ >