如何利用GPU来对ffmpeg的视频去水印进行加速?
ffmpeg的视频去水印加速能力显著。在GPU支持下,匹配匹配处理5分钟视频只需约秒。源码源码首先,模板模板你需要确保ffmpeg的匹配匹配正确安装,无论是源码源码全新源码编辑器作品通过yum源还是源码安装,都要关注硬件加速选项。模板模板GPU版本的匹配匹配ffmpeg可以通过卸载原有版本,安装nasm、源码源码yasm等依赖库,模板模板以及libx、匹配匹配libx等编码器来实现。源码源码
编译ffmpeg时,模板模板可能会遇到一些问题,匹配匹配如libfdk_acc的源码源码版本不兼容,但去水印主要涉及视频处理,音频编码可选。安装完成后,你会发现ffmpeg的硬件加速器变为cuvid,支持CUDA。对于去水印,使用delogo功能,需指定视频编码、比特率和logo位置参数。
GPU加速下,一个例子显示,5s就能处理完成,而CPU则需要s,速度提升显著。源码出售协议对于GPU型号的指定,可以在命令中添加相应显卡号。然而,同时进行视频截取和去水印可能引发音视频同步问题,需要额外处理。
对于logo检测,模板匹配算法是常用的方法,只需提供logo模板。总的来说,ffmpeg的视频去水印功能快速且效果良好,但处理后视频质量与比特率控制可能存在挑战,特别是比特率较低的视频,可以适当调整参数以提高质量。
如何评价ORB-SLAM3?
我觉得 ORB-SLAM3 系统是基于之前的 ORB-SLAM2、ORB-SLAM-VI 进行扩展。作者组的工作一脉相承,围绕着 ORB feature-based SLAM 做了非常多有重大意义的工作。本文其中在一些重要改进模块,如 IMU 初始化、multi-map system 等,是作者组里前几年的工作。我认为这是一篇更加偏向于系统性质的文章,把这么多工作串了起来,并且作者非常慷慨的把它开源了出来,非常赞!linux awkå½ä»¤
ä¸ãawkæ¯ä¸ä¸ªå¼ºå¤§çææ¬åæå·¥å ·ï¼ç¸å¯¹äºgrepçæ¥æ¾ï¼sedçç¼è¾ï¼awkå¨å ¶å¯¹æ°æ®åæ并çææ¥åæ¶ï¼æ¾å¾å°¤ä¸ºå¼ºå¤§ãç®åæ¥è¯´awkå°±æ¯ææ件éè¡çè¯»å ¥ï¼ä»¥ç©ºæ ¼ä¸ºé»è®¤åé符å°æ¯è¡åçï¼åå¼çé¨ååè¿è¡åç§åæå¤çãäº. awkå½ä»¤æ ¼å¼åé项
2.1 awkçè¯æ³æ两ç§å½¢å¼
1. å½ä»¤è¡æ¹å¼
awk [-F field-separator] 'commands' input-file(s)
å ¶ä¸ï¼commandsæ¯çæ£awkå½ä»¤ï¼[-Fååé符]æ¯å¯éçãinput-file(s)æ¯å¾ å¤ççæ件ã
å¨awkä¸ï¼æ件çæ¯ä¸è¡ä¸ï¼ç±ååé符åå¼çæ¯ä¸é¡¹ç§°ä¸ºä¸ä¸ªåãé常ï¼å¨ä¸æå-Fååé符çæ åµä¸ï¼é»è®¤çååé符æ¯ç©ºæ ¼ã
2. å°ææçawkå½ä»¤æå ¥ä¸ä¸ªåç¬æ件ï¼ç¶åè°ç¨:
awk -f awk-script-file input-file(s)
å ¶ä¸ï¼-fé项å è½½awk-script-fileä¸çawkèæ¬ï¼input-file(s)è·ä¸é¢çæ¯ä¸æ ·çã
2.2 å½ä»¤é项
ï¼1ï¼-F fs or --field-separator fs ï¼æå®è¾å ¥æ件æåé符ï¼fsæ¯ä¸ä¸ªå符串æè æ¯ä¸ä¸ªæ£å表达å¼ï¼å¦-F:ã
ï¼2ï¼-v var=value or --asign var=value ï¼èµå¼ä¸ä¸ªç¨æ·å®ä¹åéã
ï¼3ï¼-f scripfile or --file scriptfile ï¼ä»èæ¬æ件ä¸è¯»åawkå½ä»¤ã
ï¼4ï¼-mf nnn and -mr nnn ï¼å¯¹nnnå¼è®¾ç½®å å¨éå¶ï¼-mfé项éå¶åé ç»nnnçæ大åæ°ç®ï¼-mré项éå¶è®°å½çæ大æ°ç®ãè¿ä¸¤ä¸ªåè½æ¯Bellå®éªå®¤çawkçæ©å±åè½ï¼å¨æ åawkä¸ä¸éç¨ã
ï¼5ï¼-W compact or --compat, -W traditional or --traditional ï¼å¨å ¼å®¹æ¨¡å¼ä¸è¿è¡awkãæ以gawkçè¡ä¸ºåæ åçawkå®å ¨ä¸æ ·ï¼ææçawkæ©å±é½è¢«å¿½ç¥ã
ï¼6ï¼-W copyleft or --copyleft, -W copyright or --copyright ï¼æå°ç®çççæä¿¡æ¯ã
ï¼7ï¼-W help or --help, -W usage or --usage ï¼æå°å ¨é¨awké项åæ¯ä¸ªé项çç®ç说æã
ï¼8ï¼-W lint or --lint ï¼æå°ä¸è½åä¼ ç»unixå¹³å°ç§»æ¤çç»æçè¦åã
ï¼9ï¼-W lint-old or --lint-old ï¼æå°å ³äºä¸è½åä¼ ç»unixå¹³å°ç§»æ¤çç»æçè¦åã
ï¼ï¼-W posix ï¼æå¼å ¼å®¹æ¨¡å¼ãä½æ以ä¸éå¶ï¼ä¸è¯å«ï¼/xãå½æ°å ³é®åãfuncãæ¢ç åºå以åå½fsæ¯ä¸ä¸ªç©ºæ ¼æ¶ï¼å°æ°è¡ä½ä¸ºä¸ä¸ªååé符ï¼æä½ç¬¦**å**=ä¸è½ä»£æ¿^å^=ï¼fflushæ æã
ï¼ï¼-W re-interval or --re-inerval ï¼å 许é´éæ£å表达å¼ç使ç¨ï¼åè(grepä¸çPosixå符类)ï¼å¦æ¬å·è¡¨è¾¾å¼[[:alpha:]]ã
ï¼ï¼-W source program-text or --source program-text ï¼ä½¿ç¨program-textä½ä¸ºæºä»£ç ï¼å¯ä¸-få½ä»¤æ··ç¨ã
ï¼ï¼-W version or --version ï¼æå°bugæ¥åä¿¡æ¯ççæ¬ã
ä¸. 使ç¨æ¹æ³
#awk '{ pattern + action}' { filenames}
尽管æä½å¯è½ä¼å¾å¤æï¼ä½è¯æ³æ»æ¯è¿æ ·ï¼å ¶ä¸ pattern 表示 AWK å¨æ°æ®ä¸æ¥æ¾çå 容ï¼è action æ¯å¨æ¾å°å¹é å 容æ¶ææ§è¡çä¸ç³»åå½ä»¤ãè±æ¬å·ï¼{ }ï¼ä¸éè¦å¨ç¨åºä¸å§ç»åºç°ï¼ä½å®ä»¬ç¨äºæ ¹æ®ç¹å®ç模å¼å¯¹ä¸ç³»åæ令è¿è¡åç»ã patternå°±æ¯è¦è¡¨ç¤ºçæ£å表达å¼ï¼ç¨ææ æ¬èµ·æ¥ã
awkè¯è¨çæåºæ¬åè½æ¯å¨æ件æè å符串ä¸åºäºæå®è§åæµè§åæ½åä¿¡æ¯ï¼awkæ½åä¿¡æ¯åï¼æè½è¿è¡å ¶ä»ææ¬æä½ãå®æ´çawkèæ¬é常ç¨æ¥æ ¼å¼åææ¬æ件ä¸çä¿¡æ¯ã
é常ï¼awkæ¯ä»¥æ件çä¸è¡ä¸ºå¤çåä½çãawkæ¯æ¥æ¶æ件çä¸è¡ï¼ç¶åæ§è¡ç¸åºçå½ä»¤ï¼æ¥å¤çææ¬ã
å. 模å¼åæä½
awkèæ¬æ¯ç±æ¨¡å¼åæä½ç»æçï¼
pattern { action} å¦$ awk '/root/' testï¼æ$ awk '$3 < ' testã
两è æ¯å¯éçï¼å¦æ没æ模å¼ï¼åactionåºç¨å°å ¨é¨è®°å½ï¼å¦æ没æactionï¼åè¾åºå¹é å ¨é¨è®°å½ãé»è®¤æ åµä¸ï¼æ¯ä¸ä¸ªè¾å ¥è¡é½æ¯ä¸æ¡è®°å½ï¼ä½ç¨æ·å¯éè¿RSåéæå®ä¸åçåé符è¿è¡åéã
4.1. 模å¼
模å¼å¯ä»¥æ¯ä»¥ä¸ä»»æä¸ä¸ªï¼
ï¼1ï¼æ£å表达å¼ï¼ä½¿ç¨éé 符çæ©å±éã
ï¼2ï¼å ³ç³»è¡¨è¾¾å¼ï¼å¯ä»¥ç¨ä¸é¢è¿ç®ç¬¦è¡¨ä¸çå ³ç³»è¿ç®ç¬¦è¿è¡æä½ï¼å¯ä»¥æ¯å符ï¼3ï¼ä¸²ææ°åçæ¯è¾ï¼å¦$2>%1éæ©ç¬¬äºä¸ªå段æ¯ç¬¬ä¸ä¸ªå段é¿çè¡ã
ï¼4ï¼æ¨¡å¼å¹é 表达å¼ï¼ç¨è¿ç®ç¬¦~(å¹é )å~!(ä¸å¹é )ã
ï¼5ï¼æ¨¡å¼ï¼æ¨¡å¼ï¼æå®ä¸ä¸ªè¡çèå´ã该è¯æ³ä¸è½å æ¬BEGINåEND模å¼ã
ï¼6ï¼BEGINï¼è®©ç¨æ·æå®å¨ç¬¬ä¸æ¡è¾å ¥è®°å½è¢«å¤çä¹åæåççå¨ä½ï¼é常å¯å¨è¿éè®¾ç½®å ¨å±åéã
ï¼7ï¼ENDï¼è®©ç¨æ·å¨æåä¸æ¡è¾å ¥è®°å½è¢«è¯»åä¹ååççå¨ä½ã
4.2. æä½
æä½ç±ä¸äººæå¤ä¸ªå½ä»¤ãå½æ°ã表达å¼ç»æï¼ä¹é´ç±æ¢è¡ç¬¦æåå·éå¼ï¼å¹¶ä½äºå¤§æ¬å·å ã主è¦æåé¨ä»½ï¼
ï¼1ï¼åéææ°ç»èµå¼
ï¼2ï¼è¾åºå½ä»¤
ï¼3ï¼å ç½®å½æ°
ï¼4ï¼æ§å¶æµå½ä»¤
äº. awkçç¯å¢åé
å . awkè¿ç®ç¬¦
ä¸. è®°å½åå
7.1. è®°å½
awkææ¯ä¸ä¸ªä»¥æ¢è¡ç¬¦ç»æçè¡ç§°ä¸ºä¸ä¸ªè®°å½ã
è®°å½åé符ï¼é»è®¤çè¾å ¥åè¾åºçåé符é½æ¯å车ï¼ä¿åå¨å 建åéORSåRSä¸ã
$0åéï¼å®æçæ¯æ´æ¡è®°å½ãå¦$ awk '{ print $0}' testå°è¾åºtestæ件ä¸çææè®°å½ã
åéNRï¼ä¸ä¸ªè®¡æ°å¨ï¼æ¯å¤çå®ä¸æ¡è®°å½ï¼NRçå¼å°±å¢å 1ã
å¦$ awk '{ print NR,$0}' testå°è¾åºtestæ件ä¸ææè®°å½ï¼å¹¶å¨è®°å½åæ¾ç¤ºè®°å½å·ã
7.2. å
è®°å½ä¸æ¯ä¸ªåè¯ç§°åâåâï¼é»è®¤æ åµä¸ä»¥ç©ºæ ¼ætabåéãawkå¯è·è¸ªåç个æ°ï¼å¹¶å¨å 建åéNFä¸ä¿å该å¼ãå¦$ awk '{ print $1,$3}' testå°æå°testæ件ä¸ç¬¬ä¸å第ä¸ä¸ªä»¥ç©ºæ ¼åå¼çå(å)ã
7.3. ååé符
å 建åéFSä¿åè¾å ¥ååé符çå¼ï¼é»è®¤æ¯ç©ºæ ¼ætabãæ们å¯ä»¥éè¿-Få½ä»¤è¡é项修æ¹FSçå¼ãå¦$ awk -F: '{ print $1,$5}' testå°æå°ä»¥åå·ä¸ºåé符ç第ä¸ï¼ç¬¬äºåçå 容ã
å¯ä»¥åæ¶ä½¿ç¨å¤ä¸ªååé符ï¼è¿æ¶åºè¯¥æåé符åææ¾å°æ¹æ¬å·ä¸ï¼å¦$awk -F'[:/t]' '{ print $1,$3}' testï¼è¡¨ç¤ºä»¥ç©ºæ ¼ãåå·åtabä½ä¸ºåé符ã
è¾åºåçåé符é»è®¤æ¯ä¸ä¸ªç©ºæ ¼ï¼ä¿åå¨OFSä¸ãå¦$ awk -F: '{ print $1,$5}' testï¼$1å$5é´çéå·å°±æ¯OFSçå¼ã
å «. å¹é æä½ç¬¦(~)
ç¨æ¥å¨è®°å½æè åå å¹é æ£å表达å¼ãå¦$ awk '$1 ~/^root/' testå°æ¾ç¤ºtestæ件第ä¸åä¸ä»¥rootå¼å¤´çè¡ã
ä¹. æ¯è¾è¡¨è¾¾å¼
conditional expression1 ? expression2: expression3ï¼
ä¾å¦ï¼
$ awk '{ max = { $1 > $3} ? $1: $3: print max}' testãå¦æ第ä¸ä¸ªå大äºç¬¬ä¸ä¸ªåï¼$1å°±èµå¼ç»maxï¼å¦å$3å°±èµå¼ç»maxã
$ awk '$1 + $2 < ' testãå¦æ第ä¸å第äºä¸ªåç¸å 大äºï¼åæå°è¿äºè¡ã
$ awk '$1 > 5 && $2 < ' test,å¦æ第ä¸ä¸ªå大äº5ï¼å¹¶ä¸ç¬¬äºä¸ªåå°äºï¼åæå°è¿äºè¡ã
å. èå´æ¨¡æ¿
èå´æ¨¡æ¿å¹é ä»ç¬¬ä¸ä¸ªæ¨¡æ¿ç第ä¸æ¬¡åºç°å°ç¬¬äºä¸ªæ¨¡æ¿ç第ä¸æ¬¡åºç°ä¹é´ææè¡ãå¦ææä¸ä¸ªæ¨¡æ¿æ²¡åºç°ï¼åå¹é å°å¼å¤´ææ«å°¾ãå¦$ awk '/root/,/mysql/' testå°æ¾ç¤ºroot第ä¸æ¬¡åºç°å°mysql第ä¸æ¬¡åºç°ä¹é´çææè¡ã
常ç¨çå大pythonå¾åå¤çå·¥å ·
åææ é¢ï¼ Python image manipulation tools.
ä½è | Parul Pandey
ç¿»è¯ | å®å ¶ç½ä¹å°ãJimmyHua
ä»å¤©ï¼å¨æ们çä¸çéå 满äºæ°æ®ï¼å¾åæ为ææè¿äºæ°æ®çéè¦ç»æé¨åãä½æ 论æ¯ç¨äºä½ç§ç¨éï¼è¿äºå¾åé½éè¦è¿è¡å¤çãå¾åå¤çå°±æ¯åæåå¤çæ°åå¾åçè¿ç¨ï¼ä¸»è¦æ¨å¨æé«å ¶è´¨éæä»ä¸æåä¸äºä¿¡æ¯ï¼ç¶åå¯ä»¥å°å ¶ç¨äºæç§ç¨éã
å¾åå¤çä¸ç常è§ä»»å¡å æ¬æ¾ç¤ºå¾åï¼åºæ¬æä½å¦è£åªã翻转ãæ转çï¼å¾ååå²ï¼åç±»åç¹å¾æåï¼å¾åæ¢å¤åå¾åè¯å«ãPythonæ为è¿ç§å¾åå¤çä»»å¡æ¯ä¸ä¸ªæ°å½éæ©ï¼è¿æ¯å 为å®ä½ä¸ºä¸ç§ç§å¦ç¼ç¨è¯è¨æ£å¨æ¥çæ®åï¼å¹¶ä¸å¨å ¶çæç³»ç»ä¸å è´¹æä¾è®¸å¤æå è¿çå¾åå¤çå·¥å ·ä¾å¤§å®¶ä½¿ç¨ã
让æ们çä¸ä¸å¯ä»¥ç¨äºå¾åå¤çä»»å¡ä¸çå¸¸ç¨ Python åºæåªäºå§ã
1.scikit-image
scikit-imageæ¯ä¸ä¸ªå¼æºçPythonå ï¼éç¨äºnumpyæ°ç»ãå®å®ç°äºç¨äºç 究ï¼æè²åå·¥ä¸åºç¨çç®æ³åå®ç¨å·¥å ·ãå³ä½¿æ¯é£äºåæ¥è§¦Pythonçæç³»ç»ç人ï¼å®ä¹æ¯ä¸ä¸ªç¸å½ç®åç´æ¥çåºãæ¤ä»£ç æ¯ç±æ´»è·çå¿æ¿è 社åºç¼åçï¼å ·æé«è´¨éååè¡è¯å®¡çæ§è´¨ã
èµæº
ææ¡£éè®°å½äºä¸°å¯çä¾ååå®é ç¨ä¾ï¼é 读ä¸é¢çææ¡£ï¼
n和pnnx和onnx
Pnnx作为ncnn的中间件,允许ncnn支持torchscript,简化了转换过程。黑客入侵源码它不直接是一个推理库,而是提供了一种将计算图导出为其他推理库所需文件格式的方法。
NCNN提供多种功能,包括手动修改参数、动态操作和加速技巧。这些修改通常针对与ONNX和ATEN的兼容性。通过理解和运用这些技巧,可以更好地利用NCNN的性能。
在转换过程中,涉及到一个概念叫“lower”,即使用支持的算子来模拟模型中不支持的算子。例如,如果模型包含一个带有padding的卷积,而推理库不支持padding,那么lower过程会将该卷积分解为垫阵和无padding的卷积。同样,sigmoid操作可能会被分解为多个基本操作以模拟其功能。
在将模型转换为ONNX时,lower操作会重复进行两次。从python代码到torchscript再到ONNX,这会导致计算图变得庞大且细碎,不利于推理优化和模型理解。此外,这种转换可能会引入额外的算子,如Gather、Unsqueeze,这些在NCNN中可能不被支持。
Pnnx位于torchscript之下,主力先锋源码提供了一种从torchscript导出ncnn模型的新途径,从而实现模型部署。Pnnx的算子定义与python代码的接口保持一致,支持类似于python的API。通过保留原始模型的算子定义和参数,Pnnx模型可以被轻松转换回原始python代码或导出为Pnnx。
在NCNN源码中,magic值记录了推理框架的版本号,表示模型文件的特定信息。Pnnx参考了NCNN的模型写法,支持更灵活的参数键,如字符串,以与python API保持一致。此外,Pnnx支持保留算术表达式的整体性,优化GPU和可编程硬件的性能,并提供自定义算子的导出和优化功能。
在将模型转换为Pnnx时,可以指定模块操作,如Focus,以合并多个小操作为一个大操作,提高效率。Pnnx还支持量化感知训练的算子导出,并在转换过程中记录量化参数,解决了量化模型导出的问题。此外,Pnnx允许在模型中指定输入形状,有助于优化表达式和常量折叠过程,cryengine c 源码同时支持静态和动态形状。
在Pnnx的内部图优化过程中,使用模板匹配技术从torchscript ir中找到对应的封闭子图,并将其替换为目标操作,从而优化模型结构。Pnnx提供了一个完整的框架,包括加载torchscript、转换为Pnnx ir、进行图优化和转换为python代码的过程。
当前Pnnx项目兼容PyTorch 1.8、1.9和1.版本,支持种PyTorch上层操作中种转换为NCNN对应的操作。Pnnx已经实现了自动单元测试和代码覆盖率,对于常用CNN模型如ResNet和ShuffleNet,转换和推理结果与原始python版本一致。未来计划增加更多PyTorch算子支持、增强单元测试、测试端到端RNN和Transformer模型,并编写使用教程和开发文档。
计算机视觉方面快速入门的重要工具之一:OpenCV
近年来,人工智能发展迅速,全球多国规划发展人工智能。我国也大力推进人工智能,众多高校成立人工智能学院与专业。在AI领域,计算机视觉与数字图像处理至关重要,人脸识别、刷脸支付、自动驾驶等是其重要应用。图像与视觉技术深入日常生活,吸引大量学习与研究者。在这一过程中,OpenCV成为不可或缺的工具。
提及计算机视觉,图像处理为其预处理过程。图像处理通过数学函数与变换分析数字图像,挖掘潜在信息,不进行推理。处理包括压缩、增强、复原、匹配、描述与识别,涉及去噪、分割与特征提取。
计算机视觉研究如何让机器“看见”,通过摄像头模拟人眼识别、跟踪、测量。比如,环绕建筑拍摄视频重建三维模型,摄像头拍摄前方场景判断通行可能性。视觉获取环境信息对于人类来说是自然而然的,但计算机视觉复杂,是一个逆问题,信息恢复过程信息不足,增加复杂性。因此,计算机视觉研究任重道远。
图像处理与计算机视觉需在计算机中处理数据,研究人员面临重复工作问题。Intel提出OpenCV概念,通过包含通用算法,避免重复,加速研究进程。OpenCV由C/C++函数与类构成,支持多种编程语言与操作系统,方便算法验证,成为计算机视觉领域重要工具。
OpenCV 4.0引入二维码检测器、ONNX转换等新功能,完善接口,优化算法与模块,改进核心功能,提高性能。新版本支持C++,移除C语言API,添加G-API等模块,增强深度学习支持。版本更新持续优化,集成深度学习模型,简化问题解决,提高效率。
本书基于OpenCV 4.1.2,深入探讨OpenCV功能与图像处理、计算机视觉应用。内容覆盖基础知识、数据处理、图像操作、直方图、滤波、形态学、目标检测、分析修复、特征点匹配、立体视觉、视频分析与机器学习。以Python语言为基础,提供函数清单、算法解释,帮助读者快速入门。
零基础学习OpenCV 4,本书作为指南,适合具备计算机视觉与Python编程基础的读者。内容从安装OpenCV 4开始,介绍模块结构与源代码,到图像处理基础知识,再到高级应用。每一章结合相关图像处理知识,深入解释OpenCV 4函数使用方法,提供示例代码。本书覆盖直方图绘制、图像模板匹配、卷积、噪声处理、边缘检测、形态学操作、形状与轮廓检测、傅里叶变换、图像分割与修复、特征点检测、相机成像原理、视频跟踪与机器学习应用。
学习本书,读者将掌握OpenCV 4的大量函数与功能,通过示例程序理解原理与应用。虽然本书不涵盖所有内容,熟练掌握介绍部分,对未涉及领域也能快速上手。通过本书,读者能深入了解计算机视觉与OpenCV,激发学习热情。
最近值得学习的 5 款 C++ 国产开源项目
C++自年诞生以来,历经多次迭代更新,直至年的C++版本,它变得更易学且强大。尽管国内开发者可能并未紧跟潮流,但他们在C++领域的贡献不可忽视。以下是来自Gitee的五个优秀的国产C++开源项目,展示了C++的实用与全能:words-picker: 这款OCR取词应用支持鼠标选词,简化阅读体验,提升取词效率,便于理解。
Ncnn-FaceTrack: 一个移动端快速人脸跟踪的开源项目,基于mtcnn检测和简单模板匹配,适用于多人脸跟踪,运行速度极快,达到帧以上。
劫掠轩辕剑: 经典RPG游戏的源码重制,修复了游戏引擎和故事情节,提供了完整的开发工具链,使用VS编译,是复古游戏开发者的宝贵资源。
snifferview: 一款网络封包修改和分析工具,功能强大,适合网络封包捕获、分析和记录工作。
QtScrcpy: Android设备的实时投屏软件,无需root权限,通过USB或TCP/IP连接,实现设备显示和控制的便捷操作。
这些项目展示了C++在不同领域的实际应用,无论是在OCR技术、游戏开发、网络工具还是移动设备控制上,都有其独特价值。
2024-11-14 10:38
2024-11-14 10:00
2024-11-14 09:00
2024-11-14 08:20
2024-11-14 08:19