想将以下代码结合到yolov5-6.1中,并且显示出质心并输出质心坐标,应该如何改动。
import argparse
import imutils
import cv2
import numpy as np
# 构建命令行参数
# --image 要处理的图像路径
ap = argparse.ArgumentParser()
ap.add_argument("-i", default="E:/yolov5/yolov5-6.1/VOCdevkit/VOC2007/JPEGImages/Charlock429.png", required=False,
help="path to the input image")
args = vars(ap.parse_args())
# 加载图像,转换成int型,不然会导致数据溢出
image = cv2.imread("E:/yolov5/yolov5-6.1/VOCdevkit/VOC2007/JPEGImages/Charlock429.png")
img1 = np.array(image, dtype='int')
# 超绿灰度图
b, g, r = cv2.split(img1)
# ExG_sub = cv2.subtract(2*g,r)
# ExG = cv2.subtract(ExG_sub,b )
ExG = 2 * g - r - b
[m, n] = ExG.shape
for i in range(m):
for j in range(n):
if ExG[i, j] < 0:
ExG[i, j] = 0
elif ExG[i, j] > 255:
ExG[i, j] = 255
ExG = np.array(ExG, dtype='uint8') # 重新转换成uint8类型
thresh = cv2.threshold(ExG, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
# 注意,在应用阈值化之后,形状是如何在黑色背景上表示为白色前景。
# 下一步是使用轮廓检测,找到这些白色区域的位置:
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
# 遍历轮廓集
for c in cnts:
# 计算轮廓区域的图像矩。 在计算机视觉和图像处理中,图像矩通常用于表征图像中对象的形状。这些力矩捕获了形状的基本统计特性,
# 包括对象的面积,质心(即,对象的中心(x,y)坐标),方向以及其他所需的特性。
M = cv2.moments(c)
cX = int(M["m10"] / M["m00"])
cY = int(M["m01"] / M["m00"])
# 在图像上绘制轮廓及质心
cv2.drawContours(image, [c], -1, (0, 255, 0), 2)
cv2.circle(image, (cX, cY), 7, (255, 255, 255), -1)
cv2.putText(image, "center", (cX - 20, cY - 20),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)
# 展示图像
cv2.imshow("Image", image)
cv2.waitKey(0)
以下是上述代码生成的图像