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
Example #3
0
 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)
Example #4
0
 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)
Example #5
0
 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)
Example #6
0
 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)
Example #8
0
 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)
Example #9
0
 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)
Example #10
0
 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)
Example #12
0
 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