opencv 图片最大连通区域识别

这里用的opencv 的python api可能跟c的api 有少许区别

1. 图片初期处理

    gray = cv.cvCreateImage (cv.cvSize (image.width, image.height), 8, 1)
    edge = cv.cvCreateImage (cv.cvSize (image.width, image.height), 8, 1)
    cv.cvCvtColor (image, gray, cv.CV_BGR2GRAY)
    cv.cvSmooth (gray, edge, cv.CV_BLUR, 3, 3, 0)
    cv.cvNot (gray, edge)
    cv.cvCanny (gray, edge, position, position * 3, 3)
    # 连接相近的边缘
    cv.cvSmooth(edge, edge, cv.CV_GAUSSIAN)
    # 连通小区域
    cv.cvDilate(edge, edge)

2. 用cvFindContours 寻找图片所有轮廓 如果底色是纯色 只用获取外轮廓 加速

这个函数明显跟c版本区别很多 注意第三个参数 不用传cvseq对象 返回的 contours 是个所有轮廓的 cvseq对象

    # 分配内存
    store = cv.cvCreateMemStorage(0)
    # 获取所有轮廓
    num_contours, contours = cv.cvFindContours(edge, store, cv.sizeof_CvContour, cv.CV_RETR_CCOMP, cv.CV_CHAIN_APPROX_SIMPLE)
    # 获取物体外轮廓
    #num_contours, contours = cv.cvFindContours(edge, store, cv.sizeof_CvContour, cv.CV_RETR_EXTERNAL, cv.CV_CHAIN_APPROX_SIMPLE)

 

3. 找到所有连通区域中 面积最大的区域

  for contour in contours.hrange():
        # 绘画区所有区域
        if debug == 1:
            color = cv.CV_RGB( random.randint(0,255)&255, random.randint(0,255)&255, random.randint(0,255)&255 )
            cv.cvDrawContours( col_edge, contour, color, color, -1, cv.CV_FILLED, 8 )
        # 图片中找到我们需要的目标 一般是最大连通区域
        #获取当前轮廓面积
        area = abs(cv.cvContourArea( contour ))

4. 得到连通区域的cvRect对象 获取区域图像拷贝

    # 获取最大区域矩形块
    aRect = cv.cvBoundingRect( contmax, 0 )

    #原始区域的不加边框
    #rcenter = cv.cvPoint2D32f(aRect.x + aRect.width/2.0, aRect.y + aRect.height/2.0)
    #dstimg = cv.cvCreateImage (cv.cvSize (aRect.width, aRect.height), 8, 3)
    #cv.cvSetZero(dstimg)
    
    # 获取我们需要的矩形区域
    cv.cvGetRectSubPix(image, dstimg, rcenter)

 

识别效果


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值