taoCMS-基于php+sqlite最小巧的CMS http://www.taocms.org/ taoCMS是基于php+sqlite/mysql的国内最小(100Kb左右)的功能完善、开源免费的CMS管理系统 2022-10-08 taoCMS-基于php+sqlite最小巧的CMS 1263 Gdrive:Linux下同步Google Drive文件、自动备份网站到Google Drive

Gdrive,Linux下上传、下载Google Drive文件的一款CLI工具,安装简单、使用方便。

一、安装Gdrive:(SSH下,基于centos 7)
1、安装

去https://github.com/prasmussen/gdrive/releases下载最新版本,解压后复制到/usr/bin/gdrive
chmod +x /usr/bin/gdrive

2、授权

gdrive about

然后会出现一串网址并询问验证码
gdrive-oauth.jpg

将地址粘贴到浏览器并登陆账号,会返回一串代码
gdrive-oauth-2.jpg

将代码粘贴到SSH下,然后会返回你的账户信息
gdrive-oauth-3.jpg

gdrive程序会自动将你的token保存在用户目录下的.gdrive目录中,所以如果不需要了记得把这个文件删掉

二、使用
常用命令如下,更多查看gdrive官网;gdrive
列出Google Drive根目录下文件、文件夹

gdrive list

下载Google Drive根目录下文件到本地(xxxx为文件名)

gdrive download xxxx

下载Google Drive根目录下文件夹到本地(xxx为文件夹名)

gdrive download xxx

把本地文件上传到Google Drive根目录下(xxxx为文件名)

gdrive upload xxxx

在Google Drive根目录下创建文件夹(xxx为文件夹名)

gdrive mkdir xxx

三、创建网站自动备份脚本,上传文件到Google Drive
1、网站自动备份脚本(基于Mysql数据库)
脚本下载googledrive.sh
修改以下部分:
第3行:my-database-name 改为自己的数据库名
第4行:my-database-user 改为自己的数据库用户名
第5行:my-database-password 改为自己的数据库用户名对应的密码
第7行:zhujiwiki 改为自己的网站目录
第8行:/home/wwwroot 改为自己的网站所在目录(即需备份目录为 /home/wwwroot/zhujiwiki)
第9行:/backups 改为备份文件存放目录
第35行:youremail@yourdomain.com 修改为自己的邮箱

2、更改权限

chmod +x googledrive.sh

3、创建定时任务

vi  /etc/crontab

添加

0 2 * * * /backups/googledrive.sh

以上备份脚本存放在 /backups/ 下,每日2点备份
重启crontab

/etc/init.d/crond restart

四、应用
配合以下博文,可以更合理利用资源。
使用Tumblr爬虫,结合h5ai创建私有视频库、图库
使用VPS创建Tumblr解析站
VPS安装Nextcloud、共享Google Drive、BT下载


]]>
taoCMS-基于php+sqlite最小巧的CMS 2022-10-02 03:10:21
1253 windows上OpenSSH服务安装及启动

GitHub下载链接


我安装的是64位版本


2,解压到C:Program FilesOpenSSH,建议是放在此目录下


3,cmd到openSSH路径下


依次执行


1)安装sshd服务


powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1
1
2)开放22号端口(如果你在windows关闭了防火墙并配置了入站规则可以不执行如下命令,多执行不影响)


netsh advfirewall firewall add rule name=sshd dir=in action=allow protocol=TCP localport=22
1
3)配置开机自启sshd服务


sc config sshd start= auto
1
到此就安装完成,建议将C:Program FilesOpenSSH添加到path中,免得每次都要切到C:Program FilesOpenSS才能使用ssh


4,启动ssh服务


net start sshd
1
5.然后就可以在cmd中连接


ssh 用户名@ip -p 端口
1
连接时注意服务器上的杀毒软件拦截




转自 https://www.cnblogs.com/GoCircle/p/11461151.html




————————————————
版权声明:本文为CSDN博主「Tomcow2021」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Tomcow2021/article/details/121537634]]>
taoCMS-基于php+sqlite最小巧的CMS 2022-07-12 00:07:12
1252 Telegram Bot - how to get a group chat id?
创建机器人:https://www.telegramstr.com/article/120.html

In order to get the group chat id, do as follows:
  1. Add the Telegram BOT to the group.

  2. Get the list of updates for your BOT:

     https://api.telegram.org/bot<YourBOTToken>/getUpdates
    

    Ex:

     https://api.telegram.org/bot123456789:jbd78sadvbdy63d37gda37bd8/getUpdates
    
  3. Look for the "chat" object:

{"update_id":8393,"message":{"message_id":3,"from":{"id":7474,"first_name":"AAA"},"chat":{"id":<group_ID>,"title":""},"date":25497,"new_chat_participant":{"id":71,"first_name":"NAME","username":"YOUR_BOT_NAME"}}}

This is a sample of the response when you add your BOT into a group.

  1. Use the "id" of the "chat" object to send your messages.

  2. (If you created the new group with the bot and you only get {"ok":true,"result":[]}, remove and add the bot again to the group)

  3. Private chart only works in image argoprojlabs/argocd-notifications:v1.1.0 or above.

]]>
taoCMS-基于php+sqlite最小巧的CMS 2022-07-07 16:07:52
1251 Remotely和MeshCentral两款开源自托管远程控制软件简要对比
背景
    近期,随着TeamViewer对国内个人用户愈发不友好,大量正常的个人使用被TeamViewer认定为商业使用,寻找其他远程控制软件替代TeamViewer的需求与日俱增。在此之前,笔者也曾使用过其他的TeamViewer替代品,包括AnyDesk、Splashtop以及XT800等国内外产品,但这些产品由于或是在国内落地不佳,或是免费版性能、线路限制较大,使用起来并不能与TeamViewer相提并论。面对这一情况,笔者考虑是否可以选择自托管的远程控制软件进行替代。
    自托管远程控制软件的中央服务器的线路是可控的,相较于AnyDesk、Splashtop等国外产品,其在国内落地条件有着显著的优势,这能极大地改善在需要通过中央服务器中继时操作的流畅度和稳定性。此外,相较于托管的远程控制软件,自托管的中央服务器由使用者自行管理,相对来说可能“更安全”,而这也是许多用户不太愿意尝试小公司或不知名公司开发的远程控制软件的原因之一。
项目介绍
Remotely
    使用.NET Core开发,客户端和服务器端都支持Windows上和Linux(需要安装相关运行时环境),GitHub地址https://github.com/lucent-sea/Remotely,官网网站https://remotely.one,演示服务器https://app.remotely.one。
MeshCentral
    使用NodeJS开发,可以使用npm install meshcentral直接安装,客户端支持Windows、Linux和MacOS。除了软件客户端之外,MeshCentral还支持Intel AMT硬件管理。GitHub地址https://github.com/Ylianst/MeshCentral,官方网站https://www.meshcommander.com/meshcentral2,演示服务器https://meshcentral.com。
功能对比
服务器端
    Remotely使用.NET Core开发,服务器端程序可以运行在Windows和Linux上(需要安装运行时环境),运行时会占用5000端口,且似乎没有方法可以更改这一端口号,官方建议在提供公共服务时使用Nginx或IIS进行反代及配置SSL。对于Windows和Ubuntu 18.04及以上版本,官方提供了一键安装脚本,其他Linux发行版则需手动安装,具体安装过程可以参考Ubuntu的自动安装脚本。
    MeshCentral的服务端软件使用NodeJS开发,服务器端程序可以运行在Windows和Linux上(理论上说MacOS应该也能运行),服务器端程序本身可以作为Web服务器使用,但也支持使用Nginx进行反向代理。MeshCentral最少需要2个端口,分别是Web端口和CIRA端口(用于Intel AMT),当使用TLS时,则需要至少3个端口,分别是用于HTTP和HTTPS的两个web端口和CIRA端口。MeshCentral的服务器端程序通过npm install meshcentral的命令即可直接安装,对于CentOS 6.x的用户,需要先安装更高版本的NodeJS才行,
主机端(被控端)
    Remotely使用.NET Core开发,它提供了两个版本的主机端软件,一个是注册为系统服务的主机端软件,另一个是用于一次性技术支持的主机端软件。正如前文提到的,由于Remotely使用.NET Core开发,它的主机端软件体积硕大无比(包含了运行时环境),安装包大小100MB+,安装后大小250MB+;用于一次性技术支持的主机端软件体积仅为5MB,初次运行时会检测系统内是否安装了需要的运行时环境,如果没有安装则会自动进行下载安装(这一过程对于国内用户来说并不友好)。使用注册为系统服务的主机端软件会将主机加入用户的设备列表,用户可以通过网页按钮直接进行无人值守远程操控,也可以远程执行命令行任务;使用一次性技术支持主机端软件会产生连接码,在网页上通过输入连接码进行远程控制,但需要主机端点击确认,即有人值守的远程控制。
    MeshCentral的主机端软件相较之下则要小得多,其Windows主机端软件仅有3MB,并且该软件同时既可注册为系统服务,又可作为一次性技术支持使用。使用Install/Update功能可以注册为系统服务,当前主机会注册到用户的设备列表,实现无人值守访问;使用Connect则可创建临时连接供一次性技术支持使用,当前主机会出现在用户的设备列表,使用后关闭软件即可销毁该连接。
操作端
    Remotely和MeshCentral均通过Web的方式向用户提供远程控制的功能,本节会从多个维度行对比。
1) 远程操作
    由于二者均通过Web的方式进行远程控制,一些组合键、快捷键的发送会受到影响(比如Ctrl+Alt+Del、Ctrl+W等),但并不影响大多数键盘鼠标操作。相比较之下,MeshCentral提供的组合键输入要更胜一筹,提供了众多的组合键输入,而Remotely则只提供了Ctrl+Alt+Del一组组合键输入。在输入法和文字输入方面,二者都表现得比较好,用户向主机端输入文字并不会受到浏览器本地输入法的影响,即不会像AnyDesk那样本地输入法为中文,会导致远端无**常输入。Remotely支持直接剪贴板操作,即在远端复制后在本地粘贴,反之亦然;MeshCentral在这方面则略为逊色,需要使用ClipBoard功能获取或设置远端的剪贴板内容。在使用过程中,笔者发现Remotely似乎不支持在远程控制中使用鼠标中键点击(滚轮滚动不受影响),而MeshCentral则没有这一问题。另外,两者都支持在远端进行命令行操作而无需连接图形界面,这也为远程管理提供了方便。
2) 多显示器多会话
    Remotely同时只能显示一个显示器的内容,可以通过侧边栏选择当前显示的显示器,MeshCentral则直接显示了多个显示器的内容。对于一台已经存在远程桌面(RDP)会话的主机,两者都可以选择连接到远程桌面会话,或者连接到控制台(即物理机界面)。但是MeshCentral在实际使用过程中偶尔会出现无法连接到远程桌面会话只能连接到远程桌面会话的问题。
3) 多媒体和文件
    Remotely支持播放远端音频,而MeshCentral没有此项功能。文件管理方面,Remotely只有一个简单的向远端发送文件的功能(可以多选发送,但不能发送文件夹),但无法从远端下载文件到本地;MeshCentral有文件管理功能,可以在不连接图形界面的情况下直接管理远端的文件,但同样只能发送文件而不能发送文件夹,且下载远端文件只能一个一个操作,不能批量下载文件或文件夹。
4) 移动端操作
    由于Remotely和MeshCentral都使用了Web作为用户界面,笔者也简单比较了二者在移动端的表现。在界面上,二者都支持移动端访问,且对移动端都有相应的优化,但在远程控制方面,Remotely则要更胜一筹。MeshCentral在移动端上无法缩放尺寸,只能大致地看一眼界面,几乎无**常进行操作,Remotely则可以缩放显示尺寸,可以在放大后进行大部分操作(不能直接滚动远端窗口的内容,只能通过控制远端窗口上的滚动条滚动内容)。
5) 连接性
    Remotely和MeshCentral二者都支持中继模式和使用WebRTC的直连模式,在实际使用过程中,MeshCentral的压缩和传输算法似乎比Remotely更先进一些,尤其是在中继模式下,MeshCentral的画质更好卡顿更少。但Remotely对WebRTC直连模式的支持要比MeshCentral更加优秀,在实际使用过程中,操作端使用4G网络连接,主机端位于单位网络的两层NAT之后,Remotely仍然能够正常使用Peer-to-Peer连接,而此时MeshCentral则只能通过服务器进行中继连接。另外,MeshCentral GitHub上的一些issue也表明,MeshCentral对于使用WebRTC进行直接连接对于网络的要求比较高,如果具有多张网卡多个IP地址很容易导致无法进行点对点连接。
总结

    在经过了对Remotely和MeshCentral的简单使用之后,笔者认为对于专业的IT人员来说,MeshCentral要更胜一筹,它提供的管理功能更加全面、完整,并且支持Intel AMT技术,同时MeshCentral的主机端软件也对用户更加友好。但是对于有音频传输需求的用户来说,Remotely则可能是他们的唯一选择,并且如果更希望使用WebRTC进行点对点直接连接以减少服务器带宽使用的话,也建议优先考虑Remotely。


附表:本文中提到的功能对照表
功能项RemotelyMeshCentral
服务器端
技术.NET CoreNodeJS
Windows支持支持
Linux支持支持
TLS(需Nginx或IIS)支持支持
Intel AMT不支持支持
主机端(被控端)
Windows支持支持
Linux支持支持
MacOS未提及支持
系统服务支持,但体积比较大支持
一次性连接支持,但客户端需要.NET Core运行时环境支持
操作端
组合键仅Ctrl+Alt+Del多种组合
输入法正常正常
鼠标操作不支持中键正常
剪贴板共享支持需使用ClipBoard工具获取、更新远端剪贴板的内容
多显示器支持支持
多会话支持支持,偶尔抽风
音频播放支持不支持
文件发送需连接图形界面后多文件发送多文件发送,且支持文件管理
文件接收不支持单文件下载
移动端查看不能缩放
移动端操作基本正常,但不能滚动只能点击,但不能右键、滚动
中继模式支持支持
点对点直连支持,好支持,不太好用,比较挑

]]>
taoCMS-基于php+sqlite最小巧的CMS 2022-07-04 05:07:15
1250 [币市套利]美元/泰达币套利
这篇文章来源于一年前团队的一项研究报告《在岸USDT报价和离岸USD报价差异研究》,以下是报告标题部分截图,报告主要分析了套利产生的概率以及利润率,结果已被应用到实际操作中,特别在2020年3月份的暴跌中获益颇丰。由于距离内部发布报告已经1年多,这里对报告数据做了更新,并去除了团队仓位的信息。策略仅供参考。

套利思路:美元(USD)和泰达币(USDT)是1:1的兑换关系,实际上USDT就是锚定美元发行的,但是由于我们国家存在着外汇管制,造成USDT的供需不平衡,价格会出现与USD的偏离,这个偏离就形成了套利机会。

注意:这个套利方式有一些门槛,有实力的玩家可以考虑。

一. 数据获取

从英为行情网站下载了从18年1月份至今的离岸美元汇率,从币易网站 爬取了USDT的数据。数据如下(注意:因为汇市周末不开盘,所以这里只保留了两个市场同时开盘时的数据

USD和USDT收盘价

二. 数据分析

3.1 USDT 与 USD 的走势图

可以看到,在18年10月份,20年1月份,20年3月份有非常明显的偏离,其它时间也存在一定的偏离,那么这个偏离空间有多大呢?

3.2 USDT 与 USD 的价差走势图

因为是套利,我们只关心差价。如图,蓝色线为价差走势,红色线为+/-0.14,也就是差价2个点的位置。我们可以看到基本都是在+/-2个点上下波动

3.2 套利名义利润率(USDT-USD)/USD 走势图

这里我们先不考虑手续费的问题,只考虑名义利润率。如下图,黄色线以上表示的是1个点的利润率,绿色线表示的是2个点,蓝色表示的是3个点

3.3 名义利润率(USDT-USD)/USD 概率分布


三. 交易策略 与收益

这里报告部分涉及到仓位,故舍去。大致思路就是价差大于多少的时候开仓,做多一个做空一个。策略没啥风险,毕竟是套利,收益也很容易计算,关键看头寸。


]]>
taoCMS-基于php+sqlite最小巧的CMS 2022-06-28 04:06:58
1249 Android 接入微信扫码库,实现堪比微信的扫码效果 微信二维码识别引擎移植到Android平台

对比市场上的扫码功能,微信扫描码功能无疑是最强的,现在腾讯已经将其开源并加入了opencv-contrib,成为opencv的一部分,本文主要记录讲解编译移植到Android上平台的过程,并奉上最终的结果,帮助有需要的兄弟伙。

本文Demo github地址
https://github.com/woshiwzy/opencv_wechat_qr.git

如果要解决Opencv摄像头横屏,竖屏,全屏,横竖屏自动切换,相机无法打开问题
文章地址: https://blog.csdn.net/wang382758656/article/details/106686455
代码地址:https://gitee.com/wangzy2018/Opencv42_study_demo.git

1.前言
         最近在做支付宝相关的业务,有些场景下生成的二维码内容超级长,生产的二维码点非常小,导致在某些低端设备上的低分辨率摄像头难以识别或者错误识。在做扫码功能的时候我理所当然的选择了Zxing作为解决方案,可客户的设备摄像头分辨率太低,导致产品验收困难。无奈之下又研究了zbar,发现和zxing的效果差不多,甚至更差(也可能是我找的包不对)但充其量也就是速度上的提升。好在同事发现微信的扫码已经开源并加入到Opencv contrib模块中,经过初步研究发现效果的确比原生的zxing 效果好不少。相比之下微信识别引擎能够更快,更准,弱光照环境也很不错,据说腾讯在zxing的基础上结合AI神经网络所以看起来更屌了。这里要给企鹅点赞(狗血的事,这波操作之后不能像zxing一样,同时扫二维码和条码,只能扫二维码了)。

2.使用篇
       因为工作安排的原因,我先让同事折腾了一番,无奈他的电脑是windows,在搭建环境和编译过程中痛苦的尝试了无数次,折腾几天后放弃了。好在我的电脑是Mac,整个过程显得顺利很多。 在我动手之前我研究了百度扫码,腾讯智能扫码服务,zxing,zbar。百度扫码我并没有看到效果的提升,而且百度的扫码并不专注于二维码,还需要收费,在百度云后台一顿操作之后放弃了。腾讯智能扫码服务集成了本文要说的开源技术,在扫码效果上肯定是不错的,不过智能扫码服务居然是收费SDK,而且10万人民币一个包… 另外两个则是一开始就已经尝试过了,短码内容没问题,长码,弱光照环境铁定吃瘪。经过几次尝试,在我的Mac上编译成功,先记录分享给需要的人……

3.环境,工具准备篇

  • 系统:Macos 11.2.2,
  • cmake 3.12.2,
  • java1.8,
  • apache-ant-1.9.15,
  • make 3.81,
  • opencv4.5.2和对应opencv_contrib,
  • Android SDK和ndk-bundle(这2个东西不要太旧,看起来影响不大)
  • Android Studio 4.1.1
    保持网络畅通,最好有梯子,编译过程中,会下载一些额外的文件,如果下载失败,可能会产生错误和警告(不过貌似对编译qr识别模块没啥影响,主要是其他模块的模型文件)

4.过程
      下载源码(master分支)
openCV源码:https://github.com/opencv/opencv
opencv_contrib源码:https://github.com/opencv/opencv_contrib

创建opencv_build文件夹,如下图(opencv文件夹中是opencv源码,opencv_contrib中是opencv_contrib源码,opencv_build目录是创建的空文件夹,备用)

在这里插入图片描述
4.1.打开Cmake

  • 指定source目录,就是刚刚的下载的opencv源码目录
  • 指定build目录,就是刚刚创建opencv_build目录

两个目录如下图设置
在这里插入图片描述

添加Entry
在这里插入图片描述

4.2.点击Add Entry添加

  • ANDROID_NDK 类型为PATH,填入你的NDK路径(最好填写sdk自带的ndk-bundle,免得报稀奇古怪错)
  • ANDROID_SDK PATH,填入你的SDK路径
    //我试图一次性把所有的平台的so都编译出来,但是配置的时候会报错,后来查了资料每次都只能填一个,所以各个平台要分别编译
  • ANDROID_ABI STRING,设置平台,不填默认为 armeabi-v7a
  • ANDROID_NATIVE_API_LEVEL STRING,默认API为21
  • ANT_EXECUTABLE PATH,填入ANT路径下的bin(用于java 封装,便于 AS 导入module)
  • ANDROID_STL STRING,根据需求写入c++_static或c++_shared(本次操作填入c++_shared)*

配置好后像下面这个而样子
在这里插入图片描述
4.3.配置toolchain

      点击Configure,选择Specify toolchain file for cross-compiling,点击Continue,选择对应NDK目录下的toolchain路径,点击Done。
在这里插入图片描述
在这里插入图片描述
       点击Done之后,就开始配置了,如果各项参数没有错误,结果大概是这样
在这里插入图片描述
4.4.添加opencv_contrib模块并调整参数

注意 OPENCV_EXTRA_MODULES_PATH参数和值,如果已经存在(先搜索一下)就填入值,如果不存在就添加这个参数和值,在这一步骤很难容易出问题,请make前检查一下!!!

  • OPENCV_EXTRA_MODULES_PATH,选择opencv_contrib/modules路径

在这里插入图片描述
下面2个参数直接在搜索框中搜索WITH_OPENCL出来后,勾选上就好

  • WITH_OPENCL=ON,添加移动端的并行架构支持
  • WITH_OPENCL_SVM =ON,开启共享虚拟内存

在这里插入图片描述

4.5.再次执行Configure和Generate
      先执行Configure,执行完之后,再点Generate
在这里插入图片描述
      每次都要等进度条执行完成,不要着急点下一步,中间可能会下载一些文件,甚至报错,我看了一下,是非QR模块用到的一些数据模型文件下载出错,对编译过程没有什么影响。

4.6.执行make(这里没有必要执行make install,这里没有必要执行make install,make 之前切记要检查配置的参数是否正确,有时候可能会重复或者设置的参数为空,估计是cmake bug)

      等上面2步都执行完成之后,opencv_build目录就生成了make需要的所有配置文件
接下来在shell下面进入到opencv_build目录,执行make命令后开始漫长的等待,我的电脑是Macbook Pro 15寸的老款,编译了大概1个小时左右,中间风扇转得飞起,中间可能会有一些警告,可以忽略。

4.7.注意.当编译执行到99%的时候可能会报下面的错误
在这里插入图片描述
    不要慌,其实到此刻需要的SO文件已经编译出来了,就在opencv_build/jni目录下,报错的原因是15-puzzle 项目sdk路径无法找到,不解决也可以(把opencv_android 导入到项目中直接用),要解决也很简单,你直接用Android Studio打开opencv_build/opencv_android(路径如下图)这个目录,Android Studio会自动配置sdk路径,导入之后Android Studio 自动操作之后,不再报错,现在关闭Android Studio之后,再次在opencv_build目录下执行make命令,这一次会执行得很快,并且能走到100%。
在这里插入图片描述
走到100%之后,Android Studio导入opencv_android 项目,就可以正常运行各个sample了,如果有错误得具体解决,我这里导入项目之后没有报错。到了这一步即便是报错了,解决起来也不麻烦了。

5.测试微信扫码引擎API
   初始化扫码引擎

public WeChatQRCode(String detector_prototxt_path, String detector_caffe_model_path, String super_resolution_prototxt_path, String super_resolution_caffe_model_path)

四个参数分别对应:detect.prototxt,detect.caffemodel,sr.prototxt,sr.caffemodel四个文件的路径

初始化之后就可以调用detectAndDecode方法进行检测识别

  • 方法1. points 参数可以保存二维码图形的位置,识别完成之后如果有需要可以绘制出一个方框
weChatQRCode.detectAndDecode(inputFrame.gray(), points);
  • 方法2. //如果不需要绘制方框,可以调用这个重载函数
weChatQRCode.detectAndDecode(mat)

6.测试效果,可以看到不能识别条码了
   横屏效果
在这里插入图片描述

  竖屏效果
在这里插入图片描述
   全屏效果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.解决各种坑

  • 1.发现有些设备无法打开相机(而且已经赋予了打开摄像头权限)

    打开应用(初始化Opencv引擎)直接崩溃,而且看不到日志,好在我之前有玩opencv的经验,大概率的原因是Opencv的一个bug,主要原因是根据JavaCameraView大小计算相机分辨率的时候计算错误,算出一个相机不支持的分辨率导致打开相机失败。

代码所在路径

org.opencv.android.CameraBridgeViewBase#calculateCameraFrameSize

这个方法完整代码如下:

protected Size calculateCameraFrameSize(List<?> supportedSizes, ListItemAccessor accessor, int surfaceWidth, int surfaceHeight) {
    
    int calcWidth = 0;
    int calcHeight = 0;

    int maxAllowedWidth = (mMaxWidth != MAX_UNSPECIFIED && mMaxWidth < surfaceWidth)? mMaxWidth : surfaceWidth;
    int maxAllowedHeight = (mMaxHeight != MAX_UNSPECIFIED && mMaxHeight < surfaceHeight)? mMaxHeight : surfaceHeight;

    for (Object size : supportedSizes) {
    
        int width = accessor.getWidth(size);
        int height = accessor.getHeight(size);
        Log.d(TAG, "trying size: " + width + "x" + height);

        if (width <= maxAllowedWidth && height <= maxAllowedHeight) {
    
            if (width >= calcWidth && height >= calcHeight) {
    
                calcWidth = (int) width;
                calcHeight = (int) height;
            }
        }
    }
    if ((calcWidth == 0 || calcHeight == 0) && supportedSizes.size() > 0)
    {
    
        Log.i(TAG, "fallback to the first frame size");
        Object size = supportedSizes.get(0);
        calcWidth = accessor.getWidth(size);
        calcHeight = accessor.getHeight(size);
    }

    Log.e(TAG,"计算得到的摄像头分辨率:"+calcWidth+"x"+calcHeight);
    return new Size(calcWidth, calcHeight); //return new Size(1920,1080)
}

测试办法是在calculateCameraFrameSize return这里直接返回一个固定值(比如直接返回new Size(1920,1080)),看看相机能不能打开,多试验几个分辨率。大多数相机打不开的问题都是这个原因,确定是这个原因后,在supportedSizes 选择一个相对较小的分辨率返回(其实像我做的项目用于单一设备,可以写死一个值-:)。

  • 2.有些设备摄像头预览不能全屏

    (关于这个问题我早先写的一个博客,Demo中有详细的解决办法,还可以控制摄像头前后切换,横竖屏自动适应,

文章链接:
https://blog.csdn.net/wang382758656/article/details/106686455

代码地址
https://gitee.com/wangzy2018/Opencv42_study_demo.git

因为计算出来的相机分辨率不一定是手机屏幕分辨率,所有可能并没有办法铺满全屏

解决办法1.最简单的方式,修改CameraBridgeViewBase的mScale属性,

org.opencv.android.CameraBridgeViewBase#mScale

这个值是缩放最终绘制在javaCamera的bitmap大小的,(但是这里有个奇葩的大坑,mScale计算的方式有问题,我在这个文章里有说)

https://blog.csdn.net/wang382758656/article/details/106686455

需要在绘制之前重新调整mscale计算方式,如下图
在这里插入图片描述
      这个代码已经在本Demo中加上去了的,下载下来就可以看到,一般情况下你直接把mscale设置2(不行的话就加大),就铺满全屏了(实际上是绘制超过屏幕边界了,除非你想手动裁剪成和屏幕一样大的)

  • 解决办法2.用自己的ImageView显示预览图,就可以很方便的控制显示大小了(简单粗暴)

    第1步:
    从下图412行以下全部注释掉
    类路径:org.opencv.android.CameraBridgeViewBase#deliverAndDrawFrame
    Opencv自带的CameraView 就不会绘制了,但是这个VIew不要设置成InVisible或者Gone,不然拿不到预览数据
    在这里插入图片描述
    第2步:
    在你实现了CvCameraViewListener2的地方(一般是你承载JavaCameraView的Activity)onCameraFrame的方法里,把这个inputFrame的rgba()方法返回的Mat转换成Bitmap(用Utils.matToBitmap方法),然后显示到ImageVIew上去,这个ImageView盖住Opencv自带的那个JavaCameraView。然后自己根据实际情况处理显示问题,到后面就和Opencv无关了,简单粗暴,适合对Opencv了解不多的同学。

  • 3.关于竖屏预览时图像旋转90度的问题

    这个需要旋转270度给他转回去就可以了(因为二维码自带定位功能,理论上不用转也识别得出来,但是看着图像位置不对特难受),详细见demo中的代码如下
    在这里插入图片描述

  • 4.性能问题和扫描框

  • 1.使用较小的摄像头分辨率能提升速度
    (org.opencv.android.CameraBridgeViewBase#calculateCameraFrameSize 这个方法,返回一个低分辨率就行,当然还有别的办法)

  • 2.裁剪后再进行识别

    可以在扫描页面上添加一个扫描框,然后在detectAndDecode方法调用前从预览图中扣除框中的内容传入识别函数,这样就能极大的减小图片大小,大幅提升速度(一般情况下用不着),可以画一个假框放到JavaCameraView上引导用户对准即可。

源码地址:https://github.com/woshiwzy/opencv_wechat_qr.git 欢迎fork star

  看到隔壁的程序员写博客把微信二维码贴在后面据说能被大佬请喝咖啡,我也试试看,顺便大家可以再次体会一下微信的扫码功能哈哈~~~~~

在这里插入图片描述

同时欢迎讨论Opencv Android问题~~~~~~~,哎,一个双休周末没了…

]]>
taoCMS-基于php+sqlite最小巧的CMS 2022-06-07 02:06:58