Flutter上架App Store避坑指南:6个高频踩坑点与完整解决方案

Flutter上架App Store审核iOS证书 本内容遵循CC 4.0 BY-SA版权协议
大鹏人文 大鹏人文 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要

先说一句:但凡你亲手把 Flutter 应用一路送到 App Store 上架,你就知道这条链路远不止“写代码 + 点上传”这么简单。我去年负责一个 Flutter 跨端项目,从证书配置到审核通过前后折腾了三周,中间被拒两次、上传失效三次、凌晨对着 Xcode 报错干瞪眼到天亮。这一篇就把整条完整链路复盘出来,重点讲我实打实踩过的 6 个坑:每个坑的现象、根因、排查过程、最终解决办法,一次性给你盘清楚。

这篇文章适合谁看?适合第一次准备把 Flutter 应用送上 App Store 的独立开发者,也适合团队里刚从 Android 转过来负责 iOS 发布的人。上架这件事有几个前置知识绕不开:开发者账号、证书、描述文件、构建上传、TestFlight 内测、审核与发布。如果你对这些概念只是听说过没实操过,那这篇正好帮你把链路补齐;如果你已经走过一遍流程,那这 6 个坑至少能帮你避开一半的返工。

1. 上架前先看懂整条链路

1.1 从代码到 App Store,完整流程到底分几步

很多人对 iOS 上架的想象是“把 ipa 拖进网页里就完事”,实际上 Flutter 上架的链路比这长得多。我用白话说一下完整顺序:先注册开发者账号并确认账号角色,然后创建 App ID(Bundle Identifier),接着配置证书和描述文件,再在 Xcode 里做好签名设置,用 flutter build ipa 打包,通过 Xcode Organizer 或命令行工具上传到 App Store Connect,等 TestFlight 处理构建,最后填写审核元数据并提交审核。

这条链路上每一环都有对应的管理后台:证书和描述文件在 Apple Developer(developer.apple.com)里管理,App 的元数据、截图、审核信息在 App Store Connect(appstoreconnect.apple.com)里管理,构建产物上传后需要等 Apple 处理完才能出现在 TestFlight 里。很多第一次上架的人搞混这两个后台,一会儿跑到这儿找证书,一会儿跑到那儿找构建,来回折腾。

我觉得最有用的方法是把链路按照“证书与签名阶段 —— 构建阶段 —— 上传与内测阶段 —— 审核阶段”切成四段,每一段单独列一个 checklist。原因很简单:问题如果在前面阶段不被拦截,后面返工成本极高。比如 Bundle ID 写错,等上传完才发现,整个构建要作废重传;再比如描述文件类型选错,Xcode 签名那一步就直接卡死,根本走不到打包。

1.2 环境与版本核对:Flutter、Xcode、CocoaPods 一个都不能乱

说句实在话,Flutter 上架 iOS 有一半的报错来自环境版本不匹配,而不是业务代码问题。我自己遇到过 Xcode 大版本升级之后,旧 Flutter 工程在构建时报出莫名其妙的编译错误;也遇到过 CocoaPods 版本过低导致 pod install 后插件依赖解析异常。

这里我分享一套相对稳妥的版本组合,基于我在实际项目里反复验证过的经验:

组件 建议版本/策略 说明
Flutter 跟随稳定版(stable) 不要长期停留在老版本,也别追 beta,稳定版修复的构建和渲染问题最多
Xcode 最新稳定版或比最新低一个大版本 上传到 App Store 的构建要求使用苹果当前支持的 Xcode 版本,过旧会被警告
CocoaPods 通过 Homebrew 安装,保持最新 Flutter 插件依赖的 iOS 侧 pod 安装需要它,版本太低会解析失败
Ruby 系统自带或 rbenv 管理 若使用 Fastlane 或 cocoapods 命令行,Ruby 环境别乱动,权限报错多源于此

构建之前一定做一次 flutter doctor -v,把 iOS 工具链的状态全部确认一遍。还有一个特别容易忽略的:工程里的 Podfile 如果注释掉了 platform :ios,默认会走一个比较老的 iOS 版本,导致部分 Flutter 插件编译报错。我现在的做法是在 Podfile 顶部显式声明 platform :ios, '13.0' 或更高,按项目最低支持版本填,这样插件编译时候的 API 可用性判断才准确。

另外建议在项目根目录的 ios/Runner.xcworkspace 打开之前,先跑一次 cd ios && pod install --repo-update。很多新人直接双击打开项目,然后发现 Flutter.framework 找不到或者插件模块缺失,本质上是没有先通过 flutter build ios 或者 pod install 把原生依赖生成出来。记住一个原则:Flutter 工程里的 iOS 目录只是一个脚手架,任何一次插件变更之后都要重新执行构建流程,不能只想当然地刷新。

2. 六坑复盘:从证书到审核,逐个拆开讲

这 6 个坑我按照链路顺序排列,每个坑都是我在真实发布过程中遇到并解决的。它们不是同一时间踩完的,而是分布在不同的项目交付阶段。我尽量把当时的报错和苹果返回的原文还原出来,方便你搜索对照。

2.1 第一个坑:Distribution 证书与描述文件选错,构建上传后一直“正在处理”

现象非常典型:上传成功后,App Store Connect 的 TestFlight 里构建列表迟迟不出现,显示“正在处理”好几个小时,最后直接变成“无法处理”。点开详情发现一句提示:Missing required icon 或者 Invalid Provisioning Profile。

我一开始以为是图标尺寸问题,把所有 icon 都重新导出一遍,结果问题照旧。最后排查到根因:Xcode 的 Signing & Capabilities 里选择的描述文件是 Development 类型,而我用 flutter build ipa 时候的 exportOptions.plist 里 method 写的是 app-store,两边类型不一致,导致构建产物签名信息错乱。

这里的解决步骤分三步:

  1. 在 Apple Developer 后台重新生成 Distribution 类型的 App Store 描述文件,Bundle ID 必须和工程完全一致。
  2. 在 Xcode 里把 Signing & Capabilities 的签名方式切换为 “Apple Distribution” 证书,并选对应描述文件。
  3. 使用 flutter build ipa --release,默认会走 App Store 发布签名,不再手动纠结 exportOptions。

后来我干脆放弃了手动勾选证书的方式,改用 Xcode 自动签名托管。做法是:在 Signing 里勾选 “Automatically manage signing”,登录同一个开发者账号,让 Xcode 自动创建和匹配 App ID 与描述文件。实测下来,这条路对 Flutter 工程来说最省心,能有效避免证书类型选错。

经验:上传之后长时间“正在处理”不要干等,先去 Apple Developer 后台确认描述文件类型和上传产物是否匹配。图标缺失这类提示往往是表面现象,真正的坑大概率在证书配置。

2.2 第二个坑:权限文案写得太敷衍,被审核直接拒绝

Flutter 应用里如果用到了相机、相册、位置、麦克风等能力,你需要在 ios/Runner/Info.plist 里声明对应的 Usage Description。我第一版写得非常偷懒,比如:

XML
<key>NSCameraUsageDescription</key>
<string>需要使用相机</string>

审核团队返回的拒绝理由我记得很清楚:Guideline 2.1 - Performance - App Completeness,大意是 “Your app uses the camera but the purpose string does not explain why”。苹果需要的不是“我用了这个权限”,而是“用户会在什么场景下因为什么功能使用这个权限”。

后来我把所有权限描述全部改写为带场景的完整文案。举两个示例:

XML
<key>NSCameraUsageDescription</key>
<string>拍摄商品照片并上传用于生成个性化推荐,拍摄过程不会存储无关内容</string>
 
<key>NSPhotoLibraryUsageDescription</key>
<string>从相册选择已有的图片用于编辑头像,你可以随时在系统设置中关闭该权限</string>

改文案这个事看着简单,但很多人不知道它的连锁反应:如果 Info.plist 里的权限声明不完整,应用在真机运行时一旦触发未声明的权限调用,系统会直接杀死进程。这在 TestFlight 内测阶段还能通过崩溃日志发现,可如果审核员在验收时遇到闪退,性质就完全不同。因此我把权限检查放进打包前的固定流程里:先用终端搜索 Info.plist 中所有 UsageDescription,再对照代码里用到的权限逐一检查,宁可多声明也不能漏。

2.3 第三个坑:隐私清单缺失,被要求补充 Required Reason API 声明

这个坑在 iOS 17.2 之后变得非常常见。苹果要求开发者在提交审核时提供 PrivacyInfo.xcprivacy 隐私清单文件,用来声明应用中使用的 API 及其原因。Flutter 项目和纯原生项目相比有个特殊情况:很多第三方插件会在原生层间接使用日期、文件时间戳、UserDefaults 这类被称为 Required Reason API 的接口,如果插件没有内置隐私清单,审核就会被卡住。

我第一次提交后在 App Store Connect 收到邮件,标题直接是 Action Needed - Privacy Policy / API Usage,要求补充隐私清单并描述 API 用途。排查起来挺头疼:不是我自己代码调用了这些 API,而是某个 Flutter 插件在 iOS 侧使用了相关能力。

我的处理方式分成三步:

  1. 把项目里所有 Flutter 插件升级到最新版本,因为主流插件基本都更新了内置的隐私清单支持。
  2. 在 Xcode 里为 Runner target 手动添加 PrivacyInfo.xcprivacy 文件,把工程里实际涉及到的 API 类别和理由填进去。
  3. 打开 Xcode 15 以上的编译报告,检查 App Privacy Report 或者引擎提示,逐个确认哪个模块引用了 Required Reason API。

如果用的是 Xcode 15 之后的版本,还可以在 Build Settings 里开启隐私清单检查,编译时直接看到哪些 API 没有声明。我自己排查下来,flutter 官方引擎本身在较新版本已自带隐私清单,问题主要在第三方插件上。所以建议是:提交审核前把插件依赖整体 upgrade 一次,并逐个查看插件的 pubspec.yaml 变更记录,而不是等苹果邮件来提醒。

2.4 第四个坑:IDFA 声明和 App 跟踪透明度弹窗引发的合规质疑

如果你的 Flutter 应用集成过广告归因或统计 SDK,App Store 审核时会被问到是否使用 IDFA。我当时的情况是:应用内嵌了一套归因统计库,会在冷启动时读取系统广告标识符,但用户没有看到任何授权弹窗,审核团队在元数据里直接标记了 App Tracking Transparency 相关合规问题。

这里最头疼的不是“要不要用 IDFA”,而是很多 Flutter 开发者根本不知道自己依赖的某个 SDK 在原生层用了它。想要稳妥解决,分两种情况处理:

如果你确认产品不需要广告归因,那就找到依赖链里引入 IDFA 的 SDK,想办法移除或替换;如果确实需要,必须在应用中集成 ATT 弹窗,并在 Info.plist 里声明 NSUserTrackingUsageDescription。Flutter 端的做法一般是用 permission_handler 插件里的相关接口,在获得用户同意后再初始化归因 SDK,并且把申请理由写得明确一些,类似“我们将请求跟踪权限,用于统计广告效果并提供个性化内容”也可以。

审核备注里最好附上说明:明确告知审核员应用在什么场景下弹出 ATT 授权框,以及如果用户拒绝,会影响哪些功能但不影响核心使用。这个说明不是必须,但我实际提交时发现,主动解释清楚会减少一次往返沟通。

2.5 第五个坑:Impeller 渲染引擎在某些真机上触发闪退

Flutter 新版本默认启用 Impeller 渲染引擎已经是常态,iOS 端的图形性能确实提升明显。但我在 TestFlight 分发给同事测试时,有同事反馈旧款 iPhone(内存较小的机型)在进入某个带复杂模糊效果的页面时会闪退。起初我以为是业务代码写崩了,看 Crashlytics 日志才发现崩溃堆栈集中在 FlutterImpellerVulkan 或者 Metal 渲染相关的调用链里。

排查过程比较曲折:我先去掉页面里的 ImageFiltered 和大量高斯模糊效果,问题依旧;后来尝试把 Info.plist 里 Flutter 的渲染引擎配置改回 Skia,闪退就消失了。这说明问题确实出在 Impeller 对特定硬件或特定场景的处理兼容性上。

处理这件事有两个方向:

  1. 如果应用对图形性能要求不高,直接在 Info.plist 中添加 FLTEnableImpeller = false,回到 Skia 渲染,兼容性最稳。
  2. 如果想保留 Impeller,就把页面中的复杂特效做降级,比如减少全屏模糊、降低贴图尺寸、避免在低端设备上使用过重的动画。

这里补充一个判断思路:闪退若只在部分真机上复现,并且无法用 Dart 层的 try-catch 捕获,就要高度怀疑是原生渲染层问题。你用 Xcode 打开工程直接运行到真机上,看到崩溃断点停在渲染线程,十有八九跟 Flutter 引擎或者 PlatformView 的交互有关。对,PlatformView 也是个高频点:如果你嵌入了原生地图或原生 WebView,Impeller 和原生视图叠加渲染时更容易出兼容性问题,上架前一定要在低配真机上过一遍。

2.6 第六个坑:加密合规声明把自己绕晕,构建一直停留在“缺少合规证明”

上传到 TestFlight 之后,构建状态栏可能显示 Missing Compliance,这是因为 App Store Connect 需要你确认应用是否使用加密。苹果的出口合规检查相当轴:要么声明“本应用仅使用系统自带加密接口且属于豁免范围”,要么提交一份完整的加密合规文档。

我在第一次上传后,选择了“使用加密”这个选项,心想这样最保险。结果系统要我补充大量加密算法信息,我回头看代码发现自己只是用了 HTTPS 网络请求,连自定义加密算法都没写。这个“声明过度”的操作直接让构建滞留了好几天,最后我新建了一个构建版本,重新在测试信息里把加密合规声明修改为使用豁免选项,构建状态才恢复正常。

正确做法是:先检查你的应用是否使用了自定义加密(比如自己实现的 AES、RSA,或者集成了非系统自带的加密 SDK)。如果只是在标准 HTTPS、TLS 通信中使用系统库,直接选 App uses encryption only to comply with export restrictions 这类豁免声明即可。千万别乱选“使用加密”,也不要完全不选,后者构建永远卡着。如果应用真的包含了自定义加密算法,那就要准备完整的文档说明,这部分走的是另一套流程,耗时会更长。

3. 实操记录:从构建到上传的完整步骤

3.1 打包前的最后检查清单

打包前花十分钟做一遍检查,比你上传后发现问题再改要快得多。我现在的强制清单长这样:

  1. ios/Runner/Info.plist 里所有权限声明都写明了具体场景,没有“需要使用麦克风”这类空话。
  2. 版本号和构建号已经按计划设定好,pubspec.yaml 里的 version 格式是 1.0.0+10,其中 +10 对应 build number。
  3. App 图标尺寸完整,包含了 1024 无透明通道图;上传用的市场截图也提前准备好了。
  4. 隐私清单 PrivacyInfo.xcprivacy 已加入 Xcode 工程,并确认编译产物包含该资源。
  5. 签名配置确认为自动托管,且登录的开发者账号正确。

这个清单我用的是一个 Markdown 文件放在项目 docs/ 目录里,每个发版节点打开照着过一遍。你也可以把清单塞进 Fastlane 的 lane 里,让脚本自动检查一部分配置项,后面我会讲到。

3.2 用 flutter build ipa 与 Xcode 上传

Flutter 应用打包 iOS 发布包的命令非常简单:

BASH
flutter build ipa --release

这条命令会在 build/ios/ipa/ 目录下生成 xxx.ipa 文件。注意它默认采用的是 App Store 发布签名,前提是前面 Xcode 签名信息没配错。构建完成后你可以通过两种方式上传到 App Store Connect:第一种是用 Xcode 的 Organizer,选择刚生成的 ipa 包点上传;第二种是用命令行工具。

命令行方式我后来更常用,因为方便集成到 CI。macOS 上可用 xcrun altool 或者新版 notarytool 上传,基本命令长这样:

BASH
xcrun altool --upload-app -f build/ios/ipa/xxx.ipa -t ios -u your@account.com -p app-specific-password

这里的 password 需要你预先在 App Store Connect 里生成一个 App 专用密码,不能用账号密码直接传。如果你配置了 API Key,也可以使用 --apiKey 的方式,更安全。上传完成后去 TestFlight 页面刷新,等构建状态从“处理中”变成“可供测试”。

3.3 TestFlight 内测:崩溃日志别只等用户截图

构建出现在 TestFlight 之后,一定要添加内部测试员做一轮真机验证。这一步能拦截大量审核期才会暴露的问题。我的习惯是把至少一台低配 iPhone、一台中端安卓备机(不对,这里说 iOS 上架就只说 iPhone)纳入测试,重点走一遍相机、相册、定位、支付等权限重场景。

还要说一个容易被忽略的事:真机崩溃后不要只依赖用户口头反馈截图。TestFlight 的构建页面里其实能看到崩溃日志,但要想看得清晰,最好引入崩溃分析服务,比如 Firebase Crashlytics。Flutter 侧接入后,Dart 层的异常和原生层崩溃都会汇总到后台,能明显缩短定位问题的时间。这个环节我吃了第五个坑的教训,后面凡是发版前必看崩溃后台,不把已知崩溃清零不发版。

3.4 提交审核时元数据和审核备注的写法

App Store Connect 里“App 信息”这一页看起来简单,但填不好容易给自己挖坑。这里列几个我反复确认的要点:

  • 截图尺寸要对应用适配:6.7 英寸截图(iPhone 15 Pro Max 等比)和 6.5 英寸截图至少各一组,如果支持 iPad 还要补 iPad 截图,尺寸不符会被直接拒。
  • 宣传文本和描述要如实描述功能,别写“全能”“万能”这类过度措辞,审核员实际打开应用后如果发现功能不符,会被判定为误导。
  • 内容版权和隐私政策链接必须有效,隐私政策我建议放到独立可访问的网页上,不要只写一段文字凑数。

审核备注这栏很多新手直接留空,我建议每次提交都认真写。模板大概是:

这是一个 Flutter 跨端开发的 XX 类型应用。首次打开会弹出用户协议和隐私政策,登录后进入首页。需要相机权限用于拍摄头像,相册权限用于选择图片。应用内无用户生成内容,无第三方广告。已通过 TestFlight 完成真机功能验证。

审核备注写清楚能降低审核员打开应用后摸不着头脑的概率。不用写太长,但要把核心功能、权限用途、测试账号(如果有登录功能)写清楚。如果你的 App 需要登录才能体验完整流程,记得在备注里附一个可用的测试账号和密码,否则审核员进不了主界面,被拒概率非常高。

4. 常见报错速查与自动化建议

4.1 高频率报错对照表

这几个月下来,我在 Flutter iOS 构建与上架过程中遇到的报错不少,挑几个出现频率最高的整理成表,方便对号入座。

报错/提示 可能原因 解决动作
No profiles for 'com.xx.xx' were found Bundle ID 与描述文件不匹配 到 Developer 后台核对 App ID,确认描述文件包含该 Bundle ID
Command PhaseScriptExecution failed ... Flutter.framework 构建依赖未生成完整 先执行 pod install,再重新 flutter build ipa
error: exportArchive: No applicable device found exportOptions 配置问题 确认 method 为 app-store,并正确设置 team id
Missing required icon App Store 图标缺失或尺寸不对 准备 1024x1024、无透明通道图标,在 App Store Connect 重新上传
ITMS-90161: Invalid Provisioning Profile 使用了 Development 描述文件传发布包 在 Xcode 中切换到 Distribution 描述文件/自动签名
TestFlight 构建长时间“正在处理” 签名类型错误或隐私清单缺失 检查 ipa 签名、证书类型,并把隐私清单补齐后重新上传

这些报错里的前三个,我基本都在前两次打包时遇到过。遇到后不要慌,按表格里的动作走,一般十五分钟内能解决。真正麻烦的是那种不报错但构建永远“未知状态”的情况,那就是签名或声明类问题,需要倒回去查配置。

4.2 建议提前备好的命令与工具

上架过程本质上是一堆命令行和后台页面之间的反复确认,我建议你在本地把这些工具备齐:

  1. flutter doctor -v:构建前必跑,检查工具链。
  2. xcodebuild -showBuildSettings:查看当前工程的签名与 bundle id 信息,定位签名错误很有效。
  3. xcrun altool:命令行上传 ipa,适合不想每次打开 Xcode Organizer 的人。
  4. Fastlane:自动化发布利器,配合 match 管理证书和描述文件,处理团队协作很有用。

Fastlane 这块多说一句:Flutter 项目里最常用的 lane 大概是构建、上传、更新 TestFlight 描述。你可以在项目根目录建 fastlane/Fastfile,用一个 lane 搞定签名、打包、上传、甚至自动填截图,前提是先把元数据准备好。它能避免手动操作带来的配置遗漏,但因为引入了额外复杂度,我建议等项目跑通手动流程后再上,不要一上来就自动化,否则报错都不知道该查哪里。

4.3 用 CI 把上传步骤固定下来

如果你负责的项目不止一个 Flutter App,或者发版频率高,建议把构建和上传放到 CI 上跑。我在项目里用 GitHub Actions 做过一条基础流水线:push 一个带版本 tag 的提交后,自动执行 flutter pub get、flutter build ipa、上传到 App Store Connect,然后在内部群推送一个 TestFlight 构建链接。

这里有一个前置条件:CI 机器上要有 iOS 签名用的证书和描述文件,而且要把这些敏感信息存到仓库的 secrets 里。Fastlane 的 match 能帮你把证书加密存到独立的证书仓库中,CI 运行时再解密导入,这样即使 Ubuntu 环境也能完成 iOS 签名。

CI 流程的好处是稳定:每次打包都从同一个干净环境出发,不会因为你本地升级了某工具导致构建行为变化。不过 CI 只负责构建和上传,审核元数据填写还是建议手动过一遍,因为涉及文案和截图,机器很难判断到底好不好看、准不准确。

4.4 审核被拒之后,别急着改代码重传

遇到审核被拒时,第一步不是改代码,而是把 App Store Connect 里 Resolution Center 的回复完整读三遍。很多时候苹果给的报错信息很模糊,比如 Guideline 2.1 - Performance 下面只有一句话。你需要判断:是功能不完整,还是权限声明问题,还是启动崩溃?同样一句话,对应的修改动作完全不同。

被拒之后的重提策略,我的经验是:

  1. 先把可复现的崩溃问题修掉,重新打一个构建版本,不要复用旧构建。
  2. 如果被拒原因和内容或功能描述有关,先更新 App Store Connect 里的宣传文本和审核备注,再提交新版本审核。
  3. 在 Resolution Center 里回复时,直接针对审核员的质疑逐条说明,不要写一长篇无关信息。比如对方说权限文案不清晰,你就把 Info.plist 里的具体文案粘贴出来,并说明应用在哪个界面会触发该权限。

很多时候审核员并不想为难你,只是需要确认你没有遗漏合规事项。你回复得越具体,审核通过速度越快。

收尾:这几个月下来,我养成的一些固定习惯

上架这件事,最怕的不是技术难,而是链路长、环节碎,一个环节错了后面全跟着乱。我踩完 6 个坑后,给自己定了几条规矩:每次发版前必须过一遍权限与隐私清单;构建上传前先确认签名方式是自动托管且账号正确;TestFlight 分发到低配机型做一次完整流程测试;审核备注里永远写清楚测试账号、权限用途和核心功能。这几条听起来没什么技术含量,但能挡住绝大多数返工。

最后分享一个小技巧:用 flutter build ipa 之前,先跑一次 flutter clean,这个动作能清掉旧构建缓存和过期的插件编译产物。我遇到过好多次“明明代码改了就差最后上传,结果一直构建失败”的诡异问题,清理之后立刻恢复正常。发布版本这事,确定性比侥幸重要得多,把能固定下来的步骤尽量固定下来,后面每次上架都会轻松不少。

相关推荐

基于Python+Open CV的手势识别算法设计

伴随着人工智能时代的到来,人机交互的领域也逐渐成为研究的一大方向;其中,手势识别是人机交互领域的一项关键技术,自此手势识别也迎来了一波高潮,近几年无论是在消费领域、电子领域、数码领域、家电领域甚至汽车领域上,都能或多或少的见到手势识别的身影。 手势识别在设计智能高效的人机界面方面具有至关重要的作用, 目前手势识别已应用到手语识别、智能监控、到虚拟现实等各个领域,手势识别的原理都是利用各种传感器(例如红外、摄像头等)对手部的形态进行捕捉并进行建模,形成一个模型信息的序列帧,而后将这些信息序列转换为机器能够识别的相对应指令(例如打开、切换菜单、移动等)来完成控制。 采用Python的集成开发环境Pycharm进行本次课程设计,在Pycharm中进行需要库(模块)的下载,调取电脑摄像头,按帧读取摄像头采集到的头像,形态学处理,图像旋转(由于摄像头采集到的图像是镜像,需要用cv2.flip将摄像头采集到的图像进行处理),选取图片中固定位置作为手势输入,用红线画出手势识别框,基于hsv的肤色检测,进行高斯滤波,找出轮廓,求出图像中手势的凹凸点,手指间角度求取。

努力学习前端的小陈

ROS-CV-ImageConverter:将ROS图像转换为OpenCV(cv :: Mat)类型的图像

ROS-CV图像转换器 依存关系 cv_bridge(ROS软件包)

Willis Wang

计算机视觉图像处理-CV2与图像插值算法

用最近邻插值与双线性插值原理完成图像缩放 最近邻插值,是指将目标图像中的点,对应到源图像中后,找到最相邻的整数点,作为插值后的输。缺点:使用最近邻插值算法处理图像放大时,在图象中可能出现明显的块状效应 双线性插值,在两个方向上做三次线性插值。使用双线性插值算法处理图像放大时,在图象中可能出现马赛克 代码 import cv2 img = cv2.imread(’./xiabang.jpg’, cv2.IMREAD_UNCHANGED) #缩放比例 scale_percent = 0.3 width = int(img.shape[1] * scale_percent) height = int

weixin_38697274

基于水平集CV模型的图像分割(Matlab代码)

基于水平集CV模型的图像分割(Matlab代码),全套代码

小宇QAQ

导向滤波(guide_filter)的python实现

导向滤波(guide_filter)的python实现,可以结合暗通道;理论实现比较好的图像去噪效果。

zachzhan_g
返回顶部
大鹏人文
博客等级 码龄10年 27粉丝 551原创