Bootstrap

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)

 

识别效果


;