def test_prosac(self): """ 改进抽样一致 """ Camera.reset() self.__last_frame = None print("PROSAC") for i in range(1, 30): start = time.clock() _, frame = Camera.get_frame() if self.__last_frame is None: self.__last_frame = frame continue img = cv2.absdiff(frame, self.__last_frame) self.__last_frame = frame img = cv2.GaussianBlur(img, (5, 5), 2.5) img = ImageUtils.morphology(img, cv2.MORPH_DILATE, 16) _, img = ImageUtils.binary(img, threshold_type=cv2.THRESH_OTSU) # 计算特征点 key_points, descriptors = ImageUtils.get_key_points(frame, img) matches = ImageUtils.knn_match(self.__target_descriptors, descriptors) if len(matches) > 0: # 匹配到合适的特征点 points = ImageUtils.get_matches_points(key_points, matches) src_key_points = ImageUtils.get_matches_points( self.__target_key_points, matches, 1) # PROSAC去除错误点 _, mask = cv2.findHomography(src_key_points, points, cv2.RHO) if mask is not None: points_after = points[mask.ravel() == 1] end = time.clock() print("%d\t%d\t%d\t%f" % (i, len(points), len(points_after), end - start))
def track(self, frame): """ 更新目标的新坐标,并返回新旧质心坐标 通过差分获取轮廓,Hu矩匹配 :param numpy.ndArray frame: :return (Point, Point, list|None): 新旧坐标 """ if self.__last_frame is None: self.__last_frame = frame return self.__position, self.__position, None else: img = cv2.absdiff(frame, self.__last_frame) # 灰度处理后再高斯滤波,降低计算量 img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) img = cv2.GaussianBlur(img, (5, 5), 2.5) _, img = ImageUtils.binary(img, threshold_type=cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU) _, contours, _ = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) min_semblance = -1 min_moments = None min_index = -1 # 计算特征的相似度 for i, feature in enumerate(self._get_feature(contours)): moments, hu_moments = feature semblance = ImageUtils.compare_hu_moments(self.__target_hu_moments, hu_moments) if semblance is not False and (semblance < min_semblance or min_semblance == -1): min_semblance = semblance min_moments = moments min_index = i self.__last_frame = frame if min_moments: old_position = self.__position self.__position = ImageUtils.get_centroid(min_moments) return old_position, self.__position, contours[min_index] else: return self.__position, self.__position, None
def test_close(self): """ 闭运算 """ ret = ImageUtils.morphology(self.__image, cv2.MORPH_CLOSE, 8) _, ret = ImageUtils.binary(ret, threshold_type=cv2.THRESH_OTSU) cv2.imwrite("result/close.jpg", ret)
def test_dilate(self): """ 膨胀 """ ret = ImageUtils.morphology(self.__image, cv2.MORPH_DILATE, 2) _, ret = ImageUtils.binary(ret, threshold_type=cv2.THRESH_OTSU) cv2.imwrite("result/dilate.jpg", ret)
def test_erode(self): """ 腐蚀 """ ret = ImageUtils.morphology(self.__image, cv2.MORPH_ERODE, 2) _, ret = ImageUtils.binary(ret, threshold_type=cv2.THRESH_OTSU) cv2.imwrite("result/erode.jpg", ret)
def setUp(self): self.__image = cv2.imread("outputs/1_0.jpg") if self.__image is None: self.fail("读取样本失败") _, img = ImageUtils.binary(self.__image, threshold_type=cv2.THRESH_OTSU) cv2.imwrite("result/origin.jpg", img)
def setUp(self): target = cv2.imread("result/track_target.jpg") mask = cv2.imread("result/mask.jpg") self.__target = cv2.cvtColor(target, cv2.COLOR_BGR2GRAY) _, self.__mask = ImageUtils.binary(mask, threshold_type=cv2.THRESH_OTSU) self.__target_key_points, self.__target_descriptors = ImageUtils.get_key_points( self.__target, self.__mask)
def test_mean_blur(self): """ 均值滤波 """ ret = cv2.pyrMeanShiftFiltering(self.__image, 3, 3) cv2.imwrite("result/mean_0.jpg", ret) _, ret = ImageUtils.binary(ret, threshold_type=cv2.THRESH_OTSU) cv2.imwrite("result/mean_1.jpg", ret)
def test_gaussian_blur(self): """ 高斯滤波 """ ret = cv2.GaussianBlur(self.__image, (3, 3), 0.8) cv2.imwrite("result/gaussian_0.jpg", ret) _, ret = ImageUtils.binary(ret, threshold_type=cv2.THRESH_OTSU) cv2.imwrite("result/gaussian_1.jpg", ret)
def test_median_blur(self): """ 中值滤波 """ ret = cv2.medianBlur(self.__image, 1) cv2.imwrite("result/median_0.jpg", ret) _, ret = ImageUtils.binary(ret, threshold_type=cv2.THRESH_OTSU) cv2.imwrite("result/median_1.jpg", ret)
def __init__(self, target): """ 构造函数 :param numpy.ndArray target: 要跟踪的目标 """ self.__last_frame = None _, self.__target = ImageUtils.binary(target, threshold_type=cv2.THRESH_OTSU) self.__target_moments = cv2.moments(self.__target, True) self.__target_hu_moments = cv2.HuMoments(self.__target_moments) self.__position = ImageUtils.get_centroid(self.__target_moments)
def _get_difference_frame(pre_frame, next_frame): """ 帧进行差分并二值化,二值化使用OTSU算法 :param numpy.ndarray pre_frame: 前一帧 :param numpy.ndarray next_frame: 后一帧 :rtype: numpy.ndarray :returns: 差分帧 """ img = cv2.absdiff(pre_frame, next_frame) img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) _, img = ImageUtils.binary(img, threshold_type=cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU) return img