opencv入门———提取视频/图像中的物体

如下图:

提取后:

这里可以加载网络摄像头对视频图像进行逐帧处理动态检测,在图书馆,我手机上模拟的网络摄像头和电脑不在同一热点,这里就直接拍了张照片进行测试。

①原图片太大了,对图像缩小一点

img=cv2.imread("C:/Users/31132/Desktop/mtest.jpg")

print(img.shape)
x,y=img.shape[0],img.shape[1]
frameWidth=x//6
frameHeight=y//6
imgRsize=cv2.resize(img,(frameWidth,frameHeight))

②对图像进行预处理,包括转换为灰度图像,高斯模糊,边缘检测,膨胀,腐蚀等,获取图像较为清晰的轮廓

def preProcessing(img):
    imgGray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)      #灰度图像
    imgBlur=cv2.GaussianBlur(imgGray,(5,5),1)         #高斯模糊
    imgCanny=cv2.Canny(imgBlur,200,200)         #边缘检测
    kernal=np.ones((5,5))                  
    imgDial=cv2.dilate(imgCanny,kernal,iterations=2) #膨胀
    imgThres=cv2.erode(imgDial,kernal,iterations=1)  #腐蚀

    return imgThres

效果如下:

③绘制轮廓,检测图像位置,获取四个楞角

def getContours(img):
    coutours,hierarchy=cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
    biggest=np.array([])
    maxArea=0
    for cnt in coutours:
        area=cv2.contourArea(cnt)
        if area>5000:
            # cv2.drawContours(imgcontours, cnt, -1, (0, 0, 255), 5)
            #周长
            peri=cv2.arcLength(cnt,True)
            #拟合轮廓点集
            approx=cv2.approxPolyDP(cnt,0.03*peri,True)
            if area>maxArea and len(approx)==4:
                maxArea=area
                biggest=approx
    print(biggest)
    cv2.drawContours(imgcontours, biggest, -1, (255,140,0),22)

    return  biggest

 ④根据四个点的大小调整位置并作透视转化

def getWarp(img,biggest):
    newbig=np.zeros_like(biggest)
    newbig[0]=biggest[1]
    newbig[1]=biggest[0]
    newbig[2]=biggest[2]
    newbig[3] = biggest[3]
    print('new',newbig)
    waitdots = np.float32(newbig)
    resultd = np.float32([[0, 0], [frameWidth, 0], [0, frameHeight], [frameWidth, frameHeight]])
    martix = cv2.getPerspectiveTransform(waitdots, resultd)
    imgout = cv2.warpPerspective(img, martix, (frameWidth, frameHeight))

    return imgout

所有代码

#day05
#加载视频,网络摄像头
# cap=cv2.VideoCapture("http://192.168.137.116:4747/video")


# cap.set(3,frameWidth)
# cap.set(4,frameHeight)
# cap.set(10,150)

def getContours(img):
    coutours,hierarchy=cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
    biggest=np.array([])
    maxArea=0
    for cnt in coutours:
        area=cv2.contourArea(cnt)
        if area>5000:
            # cv2.drawContours(imgcontours, cnt, -1, (0, 0, 255), 5)
            #周长
            peri=cv2.arcLength(cnt,True)
            #拟合轮廓点集
            approx=cv2.approxPolyDP(cnt,0.03*peri,True)
            if area>maxArea and len(approx)==4:
                maxArea=area
                biggest=approx
    print(biggest)
    cv2.drawContours(imgcontours, biggest, -1, (255,140,0),22)

    return  biggest


def preProcessing(img):
    imgGray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    imgBlur=cv2.GaussianBlur(imgGray,(5,5),1)
    imgCanny=cv2.Canny(imgBlur,200,200)
    kernal=np.ones((5,5))
    imgDial=cv2.dilate(imgCanny,kernal,iterations=2)
    imgThres=cv2.erode(imgDial,kernal,iterations=1)

    return imgThres

def getWarp(img,biggest):
    newbig=np.zeros_like(biggest)
    newbig[0]=biggest[1]
    newbig[1]=biggest[0]
    newbig[2]=biggest[2]
    newbig[3] = biggest[3]
    print('new',newbig)
    waitdots = np.float32(newbig)
    resultd = np.float32([[0, 0], [frameWidth, 0], [0, frameHeight], [frameWidth, frameHeight]])
    martix = cv2.getPerspectiveTransform(waitdots, resultd)
    imgout = cv2.warpPerspective(img, martix, (frameWidth, frameHeight))

    return imgout


#图像显示:遍历帧
# while True:
#     success,img=cap.read()
img=cv2.imread("C:/Users/31132/Desktop/mtest.jpg")

print(img.shape)
x,y=img.shape[0],img.shape[1]
frameWidth=x//6
frameHeight=y//6
imgRsize=cv2.resize(img,(frameWidth,frameHeight))
imgcontours=imgRsize.copy()
imgThres=preProcessing(imgRsize)
biggest=getContours(imgThres)

imgOut=getWarp(imgRsize,biggest)
cv2.imshow("Video",imgOut)
cv2.waitKey(0)
原文地址:https://www.cnblogs.com/XiaoGao128/p/13955328.html