zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    在centos6.5上搭建elk6.5.3
    mysql 表信息查询
    pychram远程调试
    老程序员的十条告诫
    看清程序员要走的道路
    一个程序员的十年总结
    一个资深程序员成功的背后
    weisheng.cf 网站更新动态
    Endless Night 题解
    2021.1.17高一模拟赛题解
  • 原文地址:https://www.cnblogs.com/XiaoGao128/p/13955328.html
Copyright © 2011-2022 走看看