小工具知识网

当前位置: 首页 > 行业知识 > Python Opencv实践 - 简单的AR项目

行业知识

Python Opencv实践 - 简单的AR项目

2026-11-04 14:19:09 来源:互联网转载

��       这个简单的AR项目效果是,通过给定一张静态图片作为要视频中要替换的目标物品,当在视频中检测到图片中的物体时,通过单应矩阵做投影,将视频中的物体替换成一段视频播放。这个项目的所有素材来自自己的手机拍的视频。

        静态图片:

        

        当我在原视频中检测到这本书时,会将书替换成另一个视频里的内容。

        关于opencv里的透视投影,单应矩阵等概念,请自行百度。下面是代码:

import cv2 as cvimport numpy as npvideoOriginal = cv.VideoCapture("../../SampleVideos/NationalGeography.mp4")videoReplace = cv.VideoCapture("../../SampleVideos/Milo1.mp4")targetImg = cv.imread("./book.png", cv.IMREAD_COLOR)targetH,targetW,targetC = targetImg.shape#创建ORB对象orb = cv.ORB_create(nfeatures=1500)#提取ORB关键点和特征描述符kpImg,descsImg = orb.detectAndCompute(targetImg, None)#调试:绘制关键点#imgDebug = cv.drawKeypoints(targetImg, kpImg, None)#cv.imshow("ORB Keypoints", imgDebug)#匹配距离阈值matchDistanceThr = 0.75while True:    ret,frame = videoOriginal.read()    if ret == False:        break;    #frameAug表示最终合成的增强现实的结果图片    frameAug = frame.copy()        ret,frameReplace = videoReplace.read()    if ret == False:        break;    #将视频大小调整到和待替换目标图片大小    frameReplace = cv.resize(frameReplace, (targetW,targetH), interpolation=cv.INTER_AREA)        kpVideo,descsVideo = orb.detectAndCompute(frame, None)    #frame = cv.drawKeypoints(frame, kpVideo, None)    #进行特征匹配    bf = cv.BFMatcher()    matches = bf.knnMatch(descsImg, descsVideo, k=2)    goodMatches = []    for m,n in matches:        if m.distance  20):        srcPts = np.float32([kpImg[m.queryIdx].pt for m in goodMatches]).reshape(-1,1,2)        dstPts = np.float32([kpVideo[m.trainIdx].pt for m in goodMatches]).reshape(-1,1,2)        #找到单应矩阵        matrix,mask = cv.findHomography(srcPts, dstPts, cv.RANSAC, 5)        #print(matrix)        #映射targetImg的四个角点到目标平面        targetPts = np.float32([[0,0],[0,targetH],[targetW,targetH],[targetW, 0]]).reshape(-1,1,2)        targetOnVideoPts = cv.perspectiveTransform(targetPts, matrix)        #print("Target shape:", targetImg.shape)        #print("Frame shape:", frame.shape)        #print(targetPts)        #print('maps to:')        #print(targetOnVideoPts)        #print()        #绘制待替换目标图像的位置映射到视频帧后的边框结果        imgTargetOnVideoBox = cv.polylines(frame, [np.int32(targetOnVideoPts)], True, (255,0,255), 3)        #调用warpPerspective将要替换的视频文件帧图像投影到视频帧的图像        imgWarp = cv.warpPerspective(frameReplace, matrix, (frame.shape[1],frame.shape[0]))        #获得掩码图        #首先将视频帧中要替换的区域内容的mask标记为全1(白色)        maskForReplace = np.zeros((frame.shape[0],frame.shape[1]), np.uint8)        cv.fillPoly(maskForReplace, [np.int32(targetOnVideoPts)], (255,255,255))        #获得原视频帧内容的mask,将maskForReplace取反即可        maskForVideo = cv.bitwise_not(maskForReplace)        #生成增强现实的帧        frameAug = cv.bitwise_and(frameAug, frameAug, mask = maskForVideo)        frameAug = cv.bitwise_or(imgWarp, frameAug)    cv.imshow('Augmented Video', frameAug)    cv.moveWindow('Augmented Video',  imgFeatureMatching.shape[1],0)    cv.imshow('FeatureMatchResult', imgFeatureMatching)    cv.moveWindow('FeatureMatchResult', 0,0)    #cv.imshow('Mask For Video', maskForVideo)    #cv.imshow('Mask For Replace', maskForReplace)    #cv.imshow('WarpImage', imgWarp)    #cv.moveWindow("WarpImage", 800,0)    #cv.imshow('TargetOnVideo', imgTargetOnVideoBox)        #cv.imshow('VideoPlayer', frame)    if cv.waitKey(33) & 0xFF == ord('q'):        break;videoOriginal.release()videoReplace.release()cv.destroyAllWindows()

        运行结果:

Python Opencv实践简单的AR项目

上一篇:全面解析,如何轻松注销手机号码?一步步操作指南!

下一篇:服务器崩溃怎么进修啊?