这里用的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)
识别效果