Flutter上架App Store避坑指南:6个高频踩坑点与完整解决方案
先说一句:但凡你亲手把 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,两边类型不一致,导致构建产物签名信息错乱。
这里的解决步骤分三步:
- 在 Apple Developer 后台重新生成 Distribution 类型的 App Store 描述文件,Bundle ID 必须和工程完全一致。
- 在 Xcode 里把 Signing & Capabilities 的签名方式切换为 “Apple Distribution” 证书,并选对应描述文件。
- 使用
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。我第一版写得非常偷懒,比如:
审核团队返回的拒绝理由我记得很清楚:Guideline 2.1 - Performance - App Completeness,大意是 “Your app uses the camera but the purpose string does not explain why”。苹果需要的不是“我用了这个权限”,而是“用户会在什么场景下因为什么功能使用这个权限”。
后来我把所有权限描述全部改写为带场景的完整文案。举两个示例:
改文案这个事看着简单,但很多人不知道它的连锁反应:如果 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 侧使用了相关能力。
我的处理方式分成三步:
- 把项目里所有 Flutter 插件升级到最新版本,因为主流插件基本都更新了内置的隐私清单支持。
- 在 Xcode 里为 Runner target 手动添加
PrivacyInfo.xcprivacy文件,把工程里实际涉及到的 API 类别和理由填进去。 - 打开 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 对特定硬件或特定场景的处理兼容性上。
处理这件事有两个方向:
- 如果应用对图形性能要求不高,直接在
Info.plist中添加FLTEnableImpeller = false,回到 Skia 渲染,兼容性最稳。 - 如果想保留 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 打包前的最后检查清单
打包前花十分钟做一遍检查,比你上传后发现问题再改要快得多。我现在的强制清单长这样:
ios/Runner/Info.plist里所有权限声明都写明了具体场景,没有“需要使用麦克风”这类空话。- 版本号和构建号已经按计划设定好,
pubspec.yaml里的 version 格式是1.0.0+10,其中+10对应 build number。 - App 图标尺寸完整,包含了 1024 无透明通道图;上传用的市场截图也提前准备好了。
- 隐私清单
PrivacyInfo.xcprivacy已加入 Xcode 工程,并确认编译产物包含该资源。 - 签名配置确认为自动托管,且登录的开发者账号正确。
这个清单我用的是一个 Markdown 文件放在项目 docs/ 目录里,每个发版节点打开照着过一遍。你也可以把清单塞进 Fastlane 的 lane 里,让脚本自动检查一部分配置项,后面我会讲到。
3.2 用 flutter build ipa 与 Xcode 上传
Flutter 应用打包 iOS 发布包的命令非常简单:
这条命令会在 build/ios/ipa/ 目录下生成 xxx.ipa 文件。注意它默认采用的是 App Store 发布签名,前提是前面 Xcode 签名信息没配错。构建完成后你可以通过两种方式上传到 App Store Connect:第一种是用 Xcode 的 Organizer,选择刚生成的 ipa 包点上传;第二种是用命令行工具。
命令行方式我后来更常用,因为方便集成到 CI。macOS 上可用 xcrun altool 或者新版 notarytool 上传,基本命令长这样:
这里的 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 建议提前备好的命令与工具
上架过程本质上是一堆命令行和后台页面之间的反复确认,我建议你在本地把这些工具备齐:
flutter doctor -v:构建前必跑,检查工具链。xcodebuild -showBuildSettings:查看当前工程的签名与 bundle id 信息,定位签名错误很有效。xcrun altool:命令行上传 ipa,适合不想每次打开 Xcode Organizer 的人。- 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 下面只有一句话。你需要判断:是功能不完整,还是权限声明问题,还是启动崩溃?同样一句话,对应的修改动作完全不同。
被拒之后的重提策略,我的经验是:
- 先把可复现的崩溃问题修掉,重新打一个构建版本,不要复用旧构建。
- 如果被拒原因和内容或功能描述有关,先更新 App Store Connect 里的宣传文本和审核备注,再提交新版本审核。
- 在 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软件包)
计算机视觉图像处理-CV2与图像插值算法
用最近邻插值与双线性插值原理完成图像缩放 最近邻插值,是指将目标图像中的点,对应到源图像中后,找到最相邻的整数点,作为插值后的输。缺点:使用最近邻插值算法处理图像放大时,在图象中可能出现明显的块状效应 双线性插值,在两个方向上做三次线性插值。使用双线性插值算法处理图像放大时,在图象中可能出现马赛克 代码 import cv2 img = cv2.imread(’./xiabang.jpg’, cv2.IMREAD_UNCHANGED) #缩放比例 scale_percent = 0.3 width = int(img.shape[1] * scale_percent) height = int
基于水平集CV模型的图像分割(Matlab代码)
基于水平集CV模型的图像分割(Matlab代码),全套代码
导向滤波(guide_filter)的python实现
导向滤波(guide_filter)的python实现,可以结合暗通道;理论实现比较好的图像去噪效果。

