手动选取ROI区域,检测区域的边缘并计算中心

import numpy as np
import cv2 as cv

'''def ROI(srcImg, xmin, ymin, xmax, ymax):
    # 注意这里需要复制
    roiImg = srcImg[ymin:ymax, xmin:xmax].copy()
    # 利用numpy中的数组切片设置ROI区域
    srcImg[:, :, :] = 0
    # 将设置的ROI区域添加到原图像中
    srcImg[ymin:ymax, xmin:xmax] = roiImg
    cv.imshow("ROIImg", srcImg)
    # cv2.imwrite("ROIImg.png", srcImg)
    cv.waitKey(0)
    return srcImg'''

img = cv.imread('R2.bmp')
# img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
r = cv.selectROI('roi', img, False, False)
print(r)
# xmin, ymin, w, h = 1540, 355, 60, 55
xmin, ymin, w, h = r[0], r[1], r[2], r[3]

mask = np.zeros(img.shape[:2], np.uint8)
bgdModel = np.zeros((1, 65), np.float64)
fgdModel = np.zeros((1, 65), np.float64)
rect = (xmin, ymin, w, h)

# 函数的返回值是更新的 mask,bgdModel, fgdModel
cv.grabCut(img, mask, rect, bgdModel, fgdModel, iterCount=3, mode=cv.GC_INIT_WITH_RECT)
mask2 = np.where((mask == 2) | (mask == 0), 0, 255).astype('uint8')
# img1 = img * mask2[:, :, np.newaxis]
# 三通道转单通道
# img = cv.imread(mask2, cv.IMREAD_GRAYSCALE)
# cv2.imwrite("mask2.png", mask2)
# mask3 = 255 - mask2
cv.imshow("mask2", cv.resize(mask2, None, fx=0.5, fy=0.5))  # 在窗口显示 彩色随机图像
cv.waitKey(0)

# xmax, ymax = xmin + w, ymin + h
# img0 = ROI(img, xmin, ymin, xmax, ymax)

ret, thresh = cv.threshold(mask2, 127, 255, 0)
contours, hierarchy = cv.findContours(thresh, 1, 2)

# circles = cv.HoughCircles(img, cv.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0)

# draw = cv.drawContours(img, contours, -1, (0,255,0), 3)
# cnt = draw[0]
cnt = contours[0]
M = cv.moments(cnt)

cx = (M['m10'] / M['m00'])
cy = (M['m01'] / M['m00'])

print(cx, cy)
# img = cv.drawContours(img, contours, -1, (255, 0, 0), 3)
cxx = int(cx)
cyy = int(cy)
img = cv.circle(img, (cxx, cyy), 2, (255, 0, 0), -1)
# img = cv.drawContours(img, (cxx,cyy), -1, (255, 0, 0), 3)
cv.imshow('center', img)
cv.waitKey(0)
cv.destroyAllWindows()

手动选取图像中ROI区域,并对区域进行轮廓提取,求取轮廓的亚像素级质心坐标。

猜你喜欢

转载自blog.csdn.net/m0_61509658/article/details/127134551