机械加工网站推广有效果吗,微信商城小程序免费制作平台,检察院门户网站建设自查报告,西安网站建设外包这个简单的AR项目效果是#xff0c;通过给定一张静态图片作为要视频中要替换的目标物品#xff0c;当在视频中检测到图片中的物体时#xff0c;通过单应矩阵做投影#xff0c;将视频中的物体替换成一段视频播放。这个项目的所有素材来自自己的手机拍的视频。 静态图片… 这个简单的AR项目效果是通过给定一张静态图片作为要视频中要替换的目标物品当在视频中检测到图片中的物体时通过单应矩阵做投影将视频中的物体替换成一段视频播放。这个项目的所有素材来自自己的手机拍的视频。 静态图片 当我在原视频中检测到这本书时会将书替换成另一个视频里的内容。 关于opencv里的透视投影单应矩阵等概念请自行百度。下面是代码
import cv2 as cv
import 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(nfeatures1500)
#提取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), interpolationcv.INTER_AREA)kpVideo,descsVideo orb.detectAndCompute(frame, None)#frame cv.drawKeypoints(frame, kpVideo, None)#进行特征匹配bf cv.BFMatcher()matches bf.knnMatch(descsImg, descsVideo, k2)goodMatches []for m,n in matches:if m.distance matchDistanceThr * n.distance:goodMatches.append(m)#print(len(goodMatches))#调试绘制匹配结果imgFeatureMatching cv.drawMatches(targetImg, kpImg, frame, kpVideo, goodMatches, None, flags2)#找到单应矩阵#首先找到srcPts和dstPtsif (len(goodMatches) 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项目