2501_94078358 2025-11-02 19:16 采纳率: 100%
浏览 3
已结题

怎么用的opencv-python讲经过合并并且仿射的两个二维码分开

  • 已知一个二维码,和一个混合二维码,求影藏二维码,我知道是特征识别匹配,求转换数组,把原二维码仿射了,之后再把原二维码和混二维码异或看看得到什么,结果原二维码仿射后已经狠离谱了,再异或跟离谱,我又求逆数组,把混合的二维码逆了一下,再和原二维码异或,反正也不对,就是不能得到隐藏二维码
import cv2
import numpy as np
s = cv2.imread(r"C:\Users\zxl03\Desktop\opencv\source.png")
f = cv2.imread(r"C:\Users\zxl03\Desktop\opencv\flag_is_not_here.jpg")
s = cv2.resize(s,(200,200))
f = cv2.resize(f,(200,200))

orb = cv2.ORB_create(nfeatures=100)
kp1,des1 = orb.detectAndCompute(f,None)
kp2,des2 = orb.detectAndCompute(s,None)
bf = cv2.BFMatcher(cv2.NORM_HAMMING)
matches = bf.knnMatch(des1,des2,k=2)

good = []                       
for m,n in matches:
    if m.distance < 0.9*n.distance:
        good.append(m)
matches = good
matches = sorted(matches,key=lambda x:x.distance)
pts1 = np.float32([kp1[m.queryIdx].pt for m in matches[:3]]).reshape(-1,2)
pts2 = np.float32([kp2[m.trainIdx].pt for m in matches[:3]]).reshape(-1,2)

M = cv2.getAffineTransform(pts1,pts2)
r = cv2.warpAffine(f,M,(200,200))
xor = cv2.bitwise_xor(r,s)
cv2.imshow("r",r)
cv2.imshow("xor",xor)
cv2.waitKey(0)

img

img

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2025-11-02 19:20
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    解决方案

    根据你的问题描述,似乎你想实现以下步骤:

    1. 使用 OpenCV-Python 将混合二维码分离为两个二维码。
    2. 通过特征识别和匹配找到两个二维码之间的转换数组。
    3. 使用转换数组将原二维码仿射到混合二维码的位置。
    4. 将原二维码和混合二维码进行异或运算,以恢复影藏二维码。

    核心代码

    import cv2
    import numpy as np
    
    # 加载混合二维码和原二维码
    mixed_qr = cv2.imread('mixed_qr.png')
    original_qr = cv2.imread('original_qr.png')
    
    # 特征识别和匹配
    orb = cv2.ORB_create()
    kp1, des1 = orb.detectAndCompute(original_qr, None)
    kp2, des2 = orb.detectAndCompute(mixed_qr, None)
    bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
    matches = bf.match(des1, des2)
    
    # 计算转换数组
    src_pts = np.float32([kp1[m.queryIdx].pt for m in matches]).reshape(-1, 1, 2)
    dst_pts = np.float32([kp2[m.trainIdx].pt for m in matches]).reshape(-1, 1, 2)
    H, _ = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
    
    # 仿射原二维码
    warped_qr = cv2.warpPerspective(original_qr, H, (mixed_qr.shape[1], mixed_qr.shape[0]))
    
    # 异或运算
    result = cv2.bitwise_xor(mixed_qr, warped_qr)
    
    # 显示结果
    cv2.imshow('Result', result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    注意

    • 这个代码假设你已经有混合二维码和原二维码的图像文件。
    • 特征识别和匹配的步骤使用 ORB 算法和 BFMatcher。
    • 仿射原二维码使用 cv2.warpPerspective 函数。
    • 异或运算使用 cv2.bitwise_xor 函数。
    • 最后一步显示结果使用 cv2.imshow 函数。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 11月19日
  • 已采纳回答 11月11日
  • 创建了问题 11月2日