简介基于Python实现的双摄像头图像融合与拼接完整工程资源面向计算机视觉初学者和中级开发者。资源涵盖摄像头标定、特征点提取与匹配、单应性矩阵计算、图像对齐及融合等核心代码并提供图形界面程序与说明文档便于直接运行和二次开发。压缩包共83个文件以Python脚本、JPG示例图像、JSON标定文件为主辅以界面配置和README说明整体大小14.37MB轻量易用。当前已有203人学习下载适合在课程设计、多视角监控或全景拼接场景中作为参考实现。1. 摄像头图像融合与拼接一套不依赖Stitcher类的Python实时链路做过多路摄像头拼接的人都知道OpenCV自带一个cv2.Stitcher两行代码就能出全景图但真拿到现场就露馅曝光不一致时接缝像一条疤痕重叠区有人走过就出现半透明重影跑半小时画面还会慢慢漂移。这套Python资源把摄像头图像融合与拼接拆成可单步验证的流程——SIFT/ORB特征提取、单应性矩阵估计、透视变换、加权与多频段融合、曝光补偿每一段都有独立源码和参数注释不跟你绕理论。适合要接智能车视觉、全景监控、多目相机融合的从业者新手能照着代码跑通熟手可以直接拿参数表和避坑清单做现场排错。2. 拼接与融合的原理选型先定特征再定变换与权重策略2.1 特征提取选型SIFT、ORB、AKAZE各自适合哪类摄像头场景图像拼接的第一步是在两幅画面里找到对应的特征点后续所有几何关系都建立在这批对应点上。摄像头场景里最常用的是SIFT和ORBAKAZE用得少一些。SIFT的优势是尺度和旋转不变性都强两路摄像头安装角度差超过30度、或者画面里有明显透视畸变时它的匹配依然能保持稳定缺点是慢720p两幅图提取特征就要几十毫秒实时链路里常常撑不住。ORB是实时方案的常见选择。它基于FAST角点和二进制描述子匹配时用汉明距离速度比SIFT快一个数量级。但ORB的尺度不变性弱如果两路摄像头安装高度差较大或者其中一个画面被数字变焦拉过ORB的匹配质量就会明显下滑。AKAZE介于两者之间速度接近ORB、鲁棒性接近SIFT但OpenCV里AKAZE的描述子只能配浮点匹配器代码处理上多一步用的人也就少了。我的选型习惯是离线标定、红外可见光融合、夜间低照度场景用SIFT在线实时拼接、树莓派OV5647这类嵌入式摄像头场景用ORB。需要提醒的是OpenCV从4.4版本起SIFT已不受专利限制可以放心商用老教程里cv2.xfeatures2d.SIFT_create()的写法在4.4之后已废弃统一用cv2.SIFT_create()。2.2 单应性矩阵与RANSAC匹配对了为什么还会拼歪有了匹配点之后最核心的一步是估计单应性矩阵H。H是一个3×3矩阵描述右图坐标到左图坐标的透视变换关系。这个模型成立的前提是场景近似一个平面——摄像头拍墙面、地面、桌面都满足但场景里明显有深度起伏时比如走廊拐角、成排树木、立交桥下方单应性本身就不够用了拼接错位是必然的。估计H的标准做法是cv2.findHomography加RANSAC。RANSAC从匹配点里随机抽4组算出一个候选H统计有多少匹配点符合这个H迭代后取支持度最高的结果。所以它本质上是剔除误匹配的机制前提是阈值给得合理。H, mask cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0) inlier_ratio mask.sum() / max(len(mask), 1)ransacReprojThreshold5.0表示单点重投影误差在5像素以内就算内点。调到3.0能剔除更多误匹配但特征稀疏时可能算不出H调到8.0更容易出结果但混入错误匹配的风险变大。我一般先按5.0跑一遍再看inlier_ratio低于0.4说明重叠太少或特征质量差不该硬拼。提示H的方向是右图到左图src_pts来自右图、dst_pts来自左图。方向传反后H本身依然收敛拼接图却会整体错位这类问题光看内点比例看不出来需要在图上画出匹配点经H投影后的位置做验证。2.3 融合策略选型直接叠加、加权羽化、多频段融合怎么挑算出H之后右图做透视变换映射到左图坐标系两张图叠在一起就面临融合方式的选择。直接取最大值或直接平均都会在重叠区留下明显接缝因为两摄像头曝光和白平衡不可能完全一致。加权羽化是目前最实用的折中重叠区左侧以左图为主右侧以右图为主中间线性过渡代码量小缺点是重叠区里有运动物体会出现重影。多频段融合也就是拉普拉斯金字塔融合是效果最好但代价最高的方案把重叠区分解成不同频率的子带低频亮度过渡用宽融合带高频边缘细节用窄融合带既保证亮度平滑又不会把纹理抹糊。1080p下做一次需要几十毫秒实时性很难保证适合离线全景图生成。我的建议是第一版先用加权羽化跑通把曝光补偿加上接缝还明显再换多频段做对比。融合策略接缝表现重影抑制计算开销适用场景直接叠加明显无极低流程验证加权羽化较轻一般低实时拼接多频段融合几乎无好高离线全景曝光补偿加权基本无一般中多路曝光不一致3. 动手实现从摄像头帧读取到全景拼接的完整代码3.1 摄像头帧读取与预处理分辨率、帧率、畸变矫正这一步看着简单翻车率不低。cv2.VideoCapture既可以读本地USB摄像头也可以读RTSP网络摄像头海康、宇视这类设备走的就是RTSP协议。设置分辨率之后最好用get读回来确认很多USB摄像头并不支持你设置的分辨率会静默降级。import cv2 import numpy as np cap cv2.VideoCapture(0) # 0为USB摄像头RTSP流替换为rtsp://user:passip:554/Streaming/Channels/101 cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) cap.set(cv2.CAP_PROP_FPS, 30) if not cap.isOpened(): raise IOError(摄像头打开失败检查索引号或RTSP地址) # 实际分辨率确认避免后续warp参数按错误尺寸计算 width int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) print(f实际分辨率: {width}x{height}) ret, frame cap.read() if not ret: raise IOError(读帧失败常见原因摄像头被其他程序占用或RTSP鉴权失败) cap.release()这段逻辑是先把设备状态确认清楚再往下走避免后面所有步骤因为读帧失败白跑。RTSP地址里带用户名和密码时要做URL编码密码里含特殊字符会直接导致鉴权失败。如果摄像头做过标定畸变矫正必须在拼接前做广角摄像头边缘畸变会让特征点位置偏移数个像素这个误差直接传导进单应性矩阵。标定过的用cv2.initUndistortRectifyMap生成映射表再cv2.remap矫正没标定条件的话我建议不矫正——错误的矫正比不矫正更糟。3.2 特征提取与单应性估计SIFT匹配的核心代码与参数调法特征提取和匹配是整条链路里最影响拼接质量的一步。下面这段按生产环境标准写SIFT提取特征、FLANN快速匹配、ratio test过滤误匹配、RANSAC估计H最后返回内点比例用于质量判断。def align_images(img_left, img_right, feature_num2000): # 转灰度SIFT检测关键点与描述子 gray_left cv2.cvtColor(img_left, cv2.COLOR_BGR2GRAY) gray_right cv2.cvtColor(img_right, cv2.COLOR_BGR2GRAY) sift cv2.SIFT_create(nfeaturesfeature_num, contrastThreshold0.04) kp1, des1 sift.detectAndCompute(gray_left, None) kp2, des2 sift.detectAndCompute(gray_right, None) if des1 is None or des2 is None or len(kp1) 10 or len(kp2) 10: return None, None, 0.0 # FLANN匹配器KD-Tree索引k2返回最近邻和次近邻 index_params dict(algorithm1, trees5) search_params dict(checks50) flann cv2.FlannBasedMatcher(index_params, search_params) matches flann.knnMatch(des1, des2, k2) # Lowe ratio test最近邻距离要明显小于次近邻低于0.75才认为可靠 good [m for m, n in matches if m.distance 0.75 * n.distance] if len(good) 8: # 8个点是findHomography的最低要求 return None, None, 0.0 # 提取匹配点坐标RANSAC估计H src_pts np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2) dst_pts np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2) H, mask cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0) if H is None or mask.sum() 8: return None, None, 0.0 inlier_ratio mask.sum() / len(good) return H, mask, inlier_ratio三个参数值得细说。nfeatures2000是特征点数量上限720p画面里2000个点足够覆盖大多数场景如果匹配质量差先别急着加数量先看contrastThreshold——它控制低对比度点的过滤默认0.04逆光或夜间可以降到0.03但特征点数量会上升、匹配时间跟着涨。0.75是Lowe论文里的经典ratio test阈值匹配质量好可以放宽到0.8质量差收到0.6这个比调RANSAC阈值更直接。inlier_ratio请务必用起来。实时运行中这个值低于0.4基本可以判定拼接不可信——要么重叠区太小要么场景里有大量重复纹理此时应该报警而不是强行拼接。注意ORB描述子是二进制的匹配器必须用cv2.BFMatcher(cv2.NORM_HAMMING)不能和FLANN的KD-Tree索引混用否则类型对不上直接报错。实时场景把SIFT换成ORB后其他逻辑不变速度能快3到5倍nfeatures建议1500scaleFactor保持1.2nlevels8。3.3 透视变换与加权融合让拼接图的接缝自然消失拿到H之后把右图映射到左图坐标系再合成全景画布。这一步有两个关键细节一是平移对齐避免变换后的坐标出现负数导致画面被裁切二是融合权重按列生成不能简单平均。def warp_and_blend(img_left, img_right, H, blend_width200): h, w img_left.shape[:2] h_r, w_r img_right.shape[:2] # 右图四个角点经H变换后的位置决定全景画布尺寸 corners np.float32([[0, 0], [w_r-1, 0], [w_r-1, h_r-1], [0, h_r-1]]).reshape(-1, 1, 2) warped_corners cv2.perspectiveTransform(corners, H).reshape(-1, 2) all_pts np.vstack([warped_corners, [[0, 0], [w-1, 0], [w-1, h-1], [0, h-1]]]) xmin, ymin np.floor(all_pts.min(axis0)).astype(int) xmax, ymax np.ceil(all_pts.max(axis0)).astype(int) tx, ty -xmin, -ymin # 平移矩阵与H合并一次warpPerspective完成映射和平移 T np.array([[1, 0, tx], [0, 1, ty], [0, 0, 1]], dtypenp.float64) H_t T.dot(H) pano_w, pano_h xmax - xmin, ymax - ymin warped_right cv2.warpPerspective(img_right, H_t, (pano_w, pano_h), flagscv2.INTER_LINEAR) canvas np.zeros((pano_h, pano_w, 3), dtypenp.uint8) canvas[ty:ty h, tx:tx w] img_left # 找到右图在画布上的有效列区间即重叠区 mask_right (warped_right.sum(axis2) 0).astype(np.float32) cols np.where(mask_right.any(axis0))[0] if len(cols) 2: canvas[mask_right 0] warped_right[mask_right 0] return canvas c0, c1 cols.min(), cols.max() bw min(blend_width, c1 - c0) # 生成右图权重重叠区从0线性上升到1非重叠区为1 weight_r np.zeros((pano_h, pano_w, 1), dtypenp.float32) ramp np.clip((np.arange(c0, c1 1) - c0) / bw, 0, 1).astype(np.float32) weight_r[:, c0:c1 1] ramp[np.newaxis, :, np.newaxis] weight_r[mask_right 0] 0.0 weight_l 1.0 - weight_r # 加权合成clip保证像素范围合法 out canvas.astype(np.float32) * weight_l warped_right.astype(np.float32) * weight_r return np.clip(out, 0, 255).astype(np.uint8)H_t T.dot(H)把平移到单应性矩阵里避免先warp再平移产生二次插值导致图像变糊。画布尺寸由两张图的所有角点共同决定拼接图不会丢内容。weight_r用np.clip把权重限制在0到1之间重叠区宽度小于blend_width时权重直接线性走满不会除零。blend_width200是1080p下比较合适的羽化宽度。这个值太小接缝明显太大会加重运动物体重影。室内固定监控可以放宽到300智能车行驶中拼接两侧视野建议收到100以内不然路过的行人会在重叠区被拉出残影。这个参数我一般留到现场调它是整个流程里最依赖实际场景、也只能靠实际场景微调的一个。4. 融合质量调优多尺度融合与曝光补偿的实战参数4.1 拉普拉斯金字塔多频段融合层数与融合带怎么设加权羽化在接缝处理上算及格但遇到一明一暗的两路画面羽化后重叠区会有一层灰蒙蒙的过渡带细节被平均掉。进阶方案是拉普拉斯金字塔多频段融合把两幅重叠区域图分解成不同频率的层每一层用不同权重融合最后逐层重建。低频层决定亮度过渡融合带可以宽高频层承载边缘细节融合带必须窄否则纹理被拉糊。def laplacian_blend(img1, img2, mask, levels4): # img1/img2是重叠区域裁剪图mask是0~1权重图与img1同尺寸 g1 img1.astype(np.float32) g2 img2.astype(np.float32) m mask.astype(np.float32) # 高斯金字塔逐层降采样保存每层平滑图 gp1, gp2, gpm [g1], [g2], [m] for _ in range(levels): g1 cv2.pyrDown(g1) g2 cv2.pyrDown(g2) m cv2.pyrDown(m) gp1.append(g1) gp2.append(g2) gpm.append(m) # 拉普拉斯金字塔每层用原图减去上层的上采样得到细节层 lp1, lp2 [gp1[levels]], [gp2[levels]] for i in range(levels, 0, -1): size (gp1[i-1].shape[1], gp1[i-1].shape[0]) lp1.append(gp1[i-1] - cv2.pyrUp(gp1[i], dstsizesize)) lp2.append(gp2[i-1] - cv2.pyrUp(gp2[i], dstsizesize)) # 每层按对应mask融合逐层上采样累加重建 fused None for l1, l2, layer_mask in zip(lp1, lp2, gpm): layer l1 * layer_mask l2 * (1.0 - layer_mask) if fused is None: fused layer else: fused cv2.pyrUp(fused, dstsize(layer.shape[1], layer.shape[0])) layer return np.clip(fused, 0, 255).astype(np.uint8)levels4在720p下够用1080p建议5层。层数越多低频融合带覆盖越宽、亮度过渡越平滑但内存占用成倍增加每层金字塔都要存一份浮点图。cv2.pyrUp必须显式传dstsize否则遇到奇数尺寸图片时输出对不上会报错或生成错位图。这个函数只处理重叠区裁剪图不要对整个全景图跑内存吃不消。融合带宽度在金字塔里隐含在mask的降采样过程中高层mask经过多次pyrDown实际对应的融合范围变大低层mask保持较高分辨率融合范围相对变窄。这个特性天然实现了“低频宽融合、高频窄融合”不需要额外调参。4.2 曝光补偿多摄像头亮度不一致的修正方案就算两个摄像头同型号同批次自动曝光也会让两幅画面亮度不一致。先补偿再做融合接缝处才不会有亮度断层。补偿的原理很直接在重叠区统计两图的平均亮度算出各通道增益系数用这个系数修正其中一路画面。def exposure_compensate(img_left, img_right, overlap_mask): # overlap_mask是重叠区二值掩码只有重叠区像素参与统计 left_pixels img_left[overlap_mask 0].astype(np.float32) right_pixels img_right[overlap_mask 0].astype(np.float32) gains [] for c in range(3): # BGR三个通道分别算增益 ml np.mean(left_pixels[:, c]) mr np.mean(right_pixels[:, c]) gains.append(ml / mr if mr 1e-6 else 1.0) compensated img_right.astype(np.float32) for c in range(3): compensated[:, :, c] * gains[c] return np.clip(compensated, 0, 255).astype(np.uint8), gains统计区域必须是重叠区不能是全图。如果一张图大部分是天空、另一张图大部分是墙面全图统计出来的增益会把两张图拉得面目全非。overlap_mask可以在warp_and_blend里顺手生成右图变换后的有效像素与左图画布有效像素相交的部分就是重叠区。增益值最好限定在0.8到1.2之间。超过这个范围说明两路曝光差异过大靠增益救不回来需要回源头解决关闭自动曝光固定曝光时间、ISO、白平衡。我在现场遇到过海康威视监控摄像头夜晚不灵敏的情况就是自动增益在夜间被拉得过高叠加到拼接里变成闪烁的亮度带后来把两路摄像头的曝光模式都固定成手动、用同一组参数问题消失。智能车场景要注意强光反光局部过曝会让重叠区的亮度统计失真建议避开反光区域取统计样本。4.3 实时链路性能优化把单次拼接压进30ms以内实时拼接的帧率目标一般要大于15fps最好到25fps以上。单次拼接的时间主要花在特征提取、匹配、warp和融合四块。以下优化组合按收益从高到低排列优化手段作用阶段实际收益固定摄像头时复用H每30帧只重算一次特征匹配省掉80%计算480p降采样做特征提取720p做warp特征特征提取耗时减半ORB替代SIFT匹配3~5倍加速双线程分别读两路摄像头采集消除读帧阻塞复用H是收益最大的一条。摄像头一旦固定单应性矩阵在位移几个像素内是稳定的室内固定监控场景30秒重算一次完全够用画面不会出现可见漂移。如果因为风或热胀冷缩导致H失效用下一章的inlier_ratio自适应机制触发重算平时不浪费算力。降采样做特征有个数学坑480p下估计的H不能直接用在720p的warp上需要做缩放变换H_high S * H_low * S_invS是尺度对角矩阵。我见过有人直接拿低分辨率H去warp高分辨率图拼接结果整体漂移好几个像素。要么换算矩阵要么全程用同一分辨率别混。5. 常见问题与避坑指南摄像头拼接的五个翻车现场5.1 两路画面死活拼不上特征匹配全是交叉线现象把匹配结果可视化出来匹配线在两张图之间乱串findHomography返回的H把右图扭成奇怪梯形inlier_ratio长期低于0.3。原因最常见的是两路摄像头重叠区太小视野里只有边缘10%重叠可提取的特征点少RANSAC随机抽样经常采到误匹配。另一种是场景纹理稀疏两路都对着白墙或纯色天花板。解决先把重叠区加到画面宽度的25%以上再试。安装位置动不了就把RANSAC阈值降到3.0把误匹配剔得更狠同时nfeatures加到3000增加特征点基数。最后加一道硬保护inlier_ratio低于0.4时不输出拼接结果返回错误码。宁可画面黑屏不要输出一张错位图。5.2 拼接图接缝处出现亮带像贴了一条胶带现象两路画面一左一右拼接图上接缝位置有一条垂直亮带或暗带宽度几十到上百像素加权融合后依然存在。原因基本可以判定是两路摄像头的曝光差异没处理。自动曝光模式下两路摄像头对着不同场景区域测光结果不同增益差异直接体现在重叠区两侧。解决先做曝光补偿再跑融合。补偿后还有残余亮带检查白平衡差异导致的色偏——BGR三通道增益不一致画面会偏红偏蓝。现场快速验证方法把其中一路自动曝光关闭手动设置与另一路相同的曝光时间和增益看亮带是否消失。夜间场景尤其明显两路自动增益各自浮动接缝会像呼吸一样忽亮忽暗。5.3 重叠区有人走过拼接图出现重影现象人在两路摄像头的重叠区走动拼接图里出现半透明残影像被复制了一份。原因单应性矩阵假设场景是平面且静止人不是平面的一部分同一个人的图像在左右两路的坐标差异不符合H的描述。加权融合把两个位置都保留下来于是有了重影。解决最直接的是把blend_width从200收窄到60融合区域变窄重影范围随之缩小但接缝会变清晰。进阶做法是在重叠区做运动检测检测到运动物体时该区域强制只取其中一路画面不做融合。这个方案在智能车场景里很有用路过的车辆和行人不会因为拼接产生视觉错觉。5.4 跑半小时后拼接图逐渐漂移接缝错位越来越大现象刚开始拼接正常运行二三十分钟后接缝左右错开特征匹配的内点比例明显下降画面像两张图在缓慢互相滑动。原因摄像头虽然固定了但支架在风力、设备发热影响下会发生微小位移PCB板受热膨胀也会让传感器位置偏移几个像素。固定H复用的策略在长时间运行里必然失效。解决加自适应重算机制。每30秒重新检测当前帧与参考帧的特征匹配inlier_ratio低于0.5就重算H并更新连续3次低于0.3说明摄像头被外力移动了直接报警。摄像头装在云台或随动支架上时角度一变H立刻失效这时候应接入倾角传感器或编码器的读数角度变化超过阈值就触发H重算不要等漂移肉眼可见再处理。5.5 摄像头开了但读不到帧cap.isOpened()返回True但read()一直False现象cap.isOpened()是True但循环里read()返回的ret一直是False或者出来一帧黑图。原因大概率是摄像头被其他进程占用了。Windows下微信、浏览器视频通话、OBS都可能占用摄像头macOS下首次使用需要给程序授权手滑点了拒绝之后浏览器不再弹窗返回的就是黑帧Linux下gst-launch之类进程会占走/dev/video0。解决Windows用任务管理器关掉可疑进程重启一次系统最省事macOS去“系统设置-隐私与安全性-摄像头”里把对应程序授权打开Linux用lsof /dev/video0查占用进程。如果是RTSP流先用VLC单独测试这个地址能不能播放排除鉴权和网络问题再交给Python。检查完还不行大概率是摄像头硬件锁死拔插一次USB或给摄像头断电重启。6. 进阶验证用固定场景量化拼接误差再上实时链路6.1 用棋盘格标定板建立拼接真值在线调参调了几轮看起来没问题但“看起来没问题”不等于真的没问题。最可靠的验证是用标定板建立真值把棋盘格放在两路摄像头的重叠区检测角点坐标作为真值用H把左图角点投影到右图坐标系计算重投影误差。def reprojection_error(H, pts_left, pts_right): # pts_left/pts_right: Nx2 的对应角点坐标 ones np.ones((len(pts_left), 1)) pts_l_h np.hstack([pts_left, ones]) proj (H pts_l_h.T).T proj proj[:, :2] / proj[:, 2:] # 齐次坐标归一化 err np.sqrt(((proj - pts_right) ** 2).sum(axis1)) return err.mean(), err.max()验证标准按我的经验平均误差小于1.0像素说明H可靠1.0到2.5像素之间勉强可用但建议检查RANSAC阈值和特征点分布超过2.5像素H基本不可信优先检查特征匹配质量而不是继续调阈值。这个脚本我建议打包进你的验证流程以后每次动过摄像头位置都跑一遍。6.2 多路拼接的参考帧选择与滑动窗口策略三路以上摄像头拼接参考帧的选择直接决定累积误差走向。我的做法是选视角在中间的那路作为参考帧左右两侧分别向中间对齐不做环形拼接。环形拼接会让最后一路的误差累积到完全不可接受除非所有变换都是严格刚性但实际摄像头安装总有微小旋转误差。多路场景还有一个顺序问题每拼接完一路下一路的H应该基于已拼接好的全景图来算而不是基于原始单路图。常见做法是维护一个最近几帧的H缓存窗口每来一帧新图像优先与缓存里重叠度最高的图像匹配而不是固定与某一帧匹配。这样可以避免长时间运行后参考帧纹理被逐步拉离。6.3 把拼接结果接进检测流YOLO的重复框问题拼接图和单路图喂给YOLO的差异主要体现在重叠区目标会被重复检测。全景图自身不会产生重复框因为融合后物体只有一个位置但如果你在融合前分别对两路原始图做检测再映射坐标就会遇到同一个目标在两个坐标系里各出一个框的问题。解决思路是在映射到全景图坐标后做一次NMS把重叠度超过0.5的框合并。这个方案的优点是可以拿到每个摄像头自己视角下的检测置信度根据置信度挑框而不是在全景图上做降分辨率检测。火灾监控、车流统计这类场景我基本都这么做。回到我自己的习惯第一次在客户现场调红外与可见光融合时把所有参数都过了一遍最后发现是自动曝光没关夜间增益乱跳导致拼接闪烁。从那以后我每次做新场景的摄像头拼接都强制先走一遍固定场景验证——关闭自动曝光、放棋盘格、算重投影误差、确认RMSE在1.5像素以内才允许自己上实时链路调试。这套验证流程对应了资源包里的脚本和检查项下载后把摄像头索引改一下就能跑。希望帮到你。本文还有配套的精品资源点击获取
