opencv小白08PracticalExercise学习笔记02

10使用Hu矩进行形状匹配

Hu矩(或者更确切地说是Hu矩不变量)是使用对图像变换不变的中心矩计算的一组7个变量。事实证明,前6个矩不变量对于平移,缩放,旋转和映射都是不变的。而第7个矩会因为图像映射而改变。
OpenCV中,我们HuMoments()用来计算输入图像中的Hu矩。

1
2
3
_,im = cv2.threshold(im, 128, 255, cv2.THRESH_BINARY)
moment = cv2.moments(im)
huMoments = cv2.HuMoments(moment)

基于matchShapes函数计算两个图形之间的距离

1
m2 = cv2.matchShapes(im1,im2,cv2.CONTOURS_MATCH_I2,0)

您可以通过第三个参数(CONTOURS_MATCH_I1,CONTOURS_MATCH_I2或CONTOURS_MATCH_I3)使用三种b不同的距离。如果上述距离很小,则两个图像(im1和im2)相似。您可以使用任何距离测量。它们通常产生类似的结果。

11基于OpenCV的二维码扫描器

核心代码

1
2
qrDecoder = cv2.QRCodeDetector()
data,bbox,rectifiedImage = qrDecoder.detectAndDecode(inputImage)

12使用深度学习和OpenCV进行手部关键点检测

核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
inpBlob = cv2.dnn.blobFromImage(frame, 1.0 / 255, (inWidth, inHeight), (0, 0, 0), swapRB=False, crop=False)

net.setInput(inpBlob)

output = net.forward()
print("time taken by network : {:.3f}".format(time.time() - t))

points = []

for i in range(nPoints):
probMap = output[0, i, :, :]
probMap = cv2.resize(probMap, (frameWidth, frameHeight))

minVal, prob, minLoc, point = cv2.minMaxLoc(probMap)

if prob > threshold :
cv2.circle(frameCopy, (int(point[0]), int(point[1])), 8, (0, 255, 255), thickness=-1, lineType=cv2.FILLED)
points.append((int(point[0]), int(point[1])))
else :
points.append(None)

13OpenCV中使用Mask R-CNN进行对象检测和实例分割

核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# For each frame, extract the bounding box and mask for each detected object
def postprocess(boxes, masks):
numClasses = masks.shape[1]
numDetections = boxes.shape[2]

frameH = frame.shape[0]
frameW = frame.shape[1]

for i in range(numDetections):
box = boxes[0, 0, i]
mask = masks[i]
score = box[2]
if score > confThreshold:
classId = int(box[1])

# Extract the bounding box
left top right bottom = xxx

classMask = mask[classId]
drawBox(frame, classId, score, left, top, right, bottom, classMask)

14使用OpenCV实现单目标跟踪

核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bbox = cv2.selectROI(frame, False)
ok = tracker.init(frame, bbox)

while True:
ok, frame = video.read()
if not ok:
break

ok, bbox = tracker.update(frame)

if ok:
# Tracking success
p1 = (int(bbox[0]), int(bbox[1]))
p2 = (int(bbox[0] + bbox[2]), int(bbox[1] + bbox[3]))
cv2.rectangle(frame, p1, p2, (255,0,0), 2, 1)

15基于深度学习的目标跟踪算法GOTURN

核心代码:同上,只是模型变了,思路未变

16使用OpenCV实现多目标跟踪Video

核心代码:和单目标类似,Tracker变成多个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Create MultiTracker object
multiTracker = cv2.MultiTracker_create()
for bbox in bboxes:
multiTracker.add(createTrackerByName(trackerType), frame, bbox)

while cap.isOpened():
success, frame = cap.read()
if not success:
break

# get updated location of objects in subsequent frames
success, boxes = multiTracker.update(frame)

# draw tracked objects
for i, newbox in enumerate(boxes):
p1 = (int(newbox[0]), int(newbox[1]))
p2 = (int(newbox[0] + newbox[2]), int(newbox[1] + newbox[3]))
cv2.rectangle(frame, p1, p2, colors[i], 2, 1)

17基于卷积神经网络的OpenCV图像着色(略)

18Opencv中的单应性矩阵Homography(略)

Homography的应用-全景拼接

1
2
3
4
5
# Calculate Homography
h, status = cv2.findHomography(pts_src, pts_dst)

# Warp source image to destination based on homography
im_out = cv2.warpPerspective(im_src, h, (im_dst.shape[1],im_dst.shape[0]))

19使用OpenCV实现基于特征的图像对齐

OpenCV的图像对齐
2.1 基于特征的图像对齐的步骤
现在我们可以总结图像对齐所涉及的步骤。
Step1读图
我们首先在C ++中和Python中读取参考图像(或模板图像)和我们想要与此模板对齐的图像。
Step2寻找特征点
我们检测两个图像中的ORB特征。虽然我们只需要4个特征来计算单应性,但通常在两个图像中检测到数百个特征。我们使用Python和C ++代码中的参数MAX_FEATURES来控制功能的数量。
Step3 特征点匹配
我们在两个图像中找到匹配的特征,按匹配的评分对它们进行排序,并保留一小部分原始匹配。我们使用汉明距离(hamming distance)作为两个特征描述符之间相似性的度量。请注意,我们有许多不正确的匹配。
Step4 计算Homography
当我们在两个图像中有4个或更多对应点时,可以计算单应性。上一节中介绍的自动功能匹配并不总能产生100%准确的匹配。20-30%的比赛不正确并不罕见。幸运的是,findHomography方法利用称为随机抽样一致性算法(RANSAC)的强大估计技术,即使在存在大量不良匹配的情况下也能产生正确的结果。RANSAC具体介绍见:
https://www.cnblogs.com/xingshansi/p/6763668.html
https://blog.csdn.net/zinnc/article/details/52319716
Step5 图像映射
一旦计算出准确的单应性,我可以应用于一个图像中的所有像素,以将其映射到另一个图像。这是使用OpenCV中的warpPerspective函数完成的。

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×