我有一些欧元钞票的图像。账单完全在图像内 并且大部分是扁平的(例如很小的变形),并且透视歪斜很小(例如图像非常取自钞票上方)。
现在我不是图像识别方面的专家。我想实现以下目标:
我认为这两个步骤是预处理,但如果没有上述两个步骤,可能会执行以下步骤。所以,我想阅读:
我认为这应该与OpenCV完全相同。我只是不确定如何正确处理它。我会在边缘检测器上选择类似方法或霍夫或轮廓检测器的FaceDetector吗?
我还要感谢任何有关阅读材料的进一步提示。
答案 0 :(得分:1)
霍夫很棒,但可能有点贵
这可能有效:
- 使用Threshold或Canny查找图像的边缘。
- 然后cvFindContours识别轮廓,然后尝试检测矩形。 检查opencv发行版中的squares.c示例。它基本上检查轮廓的多边形近似是否有4个点,并且这些点之间的平均角度接近90度。 以下是squares.py示例中的代码段 (在python中是相同的:P)。
..some pre-processing
cvThreshold( tgray, gray, (l+1)*255/N, 255, CV_THRESH_BINARY );
# find contours and store them all as a list
count, contours = cvFindContours(gray, storage)
if not contours:
continue
# test each contour
for contour in contours.hrange():
# approximate contour with accuracy proportional
# to the contour perimeter
result = cvApproxPoly( contour, sizeof(CvContour), storage,
CV_POLY_APPROX_DP, cvContourPerimeter(contour)*0.02, 0 );
res_arr = result.asarray(CvPoint)
# square contours should have 4 vertices after approximation
# relatively large area (to filter out noisy contours)
# and be convex.
# Note: absolute value of an area is used because
# area may be positive or negative - in accordance with the
# contour orientation
if( result.total == 4 and
abs(cvContourArea(result)) > 1000 and
cvCheckContourConvexity(result) ):
s = 0;
for i in range(4):
# find minimum angle between joint
# edges (maximum of cosine)
t = abs(angle( res_arr[i], res_arr[i-2], res_arr[i-1]))
if s<t:
s=t
# if cosines of all angles are small
# (all angles are ~90 degree) then write quandrange
# vertices to resultant sequence
if( s < 0.3 ):
for i in range(4):
squares.append( res_arr[i] )
- 使用MinAreaRect2(查找给定2D点集的最小区域的外接矩形),获取矩形的边界框。使用边界框指向您可以轻松计算角度。
您还可以在opencv目录中的samples / c /下找到C版square.c。
答案 1 :(得分:0)
答案 2 :(得分:0)
您还可以查看OpenCV中的模板匹配方法;另一种选择是使用SURF功能。他们让你搜索符号&amp;数字的大小,角度等不变。