【问题标题】:How to Track any specific object that we want in an image?如何在图像中跟踪我们想要的任何特定对象?
【发布时间】:2019-11-12 19:28:07
【问题描述】:

我想在视频帧中跟踪我想要的任何对象,而不需要任何对象检测算法,例如 haar-cascade、faster-RCNN、SSD 或 YOLO。 我怎样才能做到这一点?请给我推荐任何方法。

我使用了阿德里安在此处https://www.pyimagesearch.com/2018/08/06/tracking-multiple-objects-with-opencv/ 指出的 OpenCV 跟踪 API

但是,我想做更复杂的跟踪器。 开发者可以推荐我任何算法或其他 API 吗?

【问题讨论】:

  • 你似乎想要很多东西却不付出任何努力。 How to Ask.

标签: python matlab opencv object-detection tracking


【解决方案1】:

你提到的算法可能是最好的选择。 顺便说一句,如果你有一些你想找到的物体的图像,你可以尝试使用

SIFT 点(Matlab 中的 SURF 点)

给自己写一个检测器。

您可能会发现缩放因子和计算时间可能存在一些问题,但我认为您可以尝试使用这种技术。

【讨论】:

  • 感谢您回答我的问题。实际上,我想跟踪任何对象。所以,我没有想要检测它的图像。我想在视频播放或摄像头运行时跟踪任何对象。
  • @mmtaksuu 我认为这是不可能的。您应该搜索无监督对象检测,但这并不容易,而且肯定没有像您之前提到的那样“完成”的算法。我只能说,您可以尝试使用大量负面示例和一些数据增强,但您至少需要一个正面示例(我认为您可以通过裁剪视频来获得它)。
  • 非常感谢您的帮助。我同意你的看法。我将尝试不停地从视频帧中裁剪对象。之后我会训练它一段时间,然后检测和跟踪它。我会回复你的结果。
【解决方案2】:
import numpy as np
import cv2
import copy

class selectROI():

    def __init__(self):
        self.refPt = []
        self.clickEventsEnabled = False
        self.drawingRectangle = False
        self.rectangleDrawn = False
        self.x_start = -1
        self.y_start = -1
        self.ref_frame = None

    def clickPolygonPoints(self, event, x, y, flags, param):

        temp_frame = self.ref_frame.copy()

        if(self.clickEventsEnabled == True):
                if event == cv2.EVENT_LBUTTONDOWN:
                        if((self.rectangleDrawn == False)):
                            self.drawingRectangle = True
                            self.x_start,self.y_start = x,y
                            self.refPt.append((x,y))

                elif event ==  cv2.EVENT_MOUSEMOVE: 
                        if(self.drawingRectangle == True):
                            cv2.rectangle(temp_frame, (self.x_start,self.y_start), (x,y), (0,0,255), 2)
                            cv2.imshow("ref_frame", temp_frame)
                            temp_frame = self.ref_frame

                elif event == cv2.EVENT_LBUTTONUP:
                        if((self.rectangleDrawn == False)):
                            self.drawingRectangle = False
                            self.rectangleDrawn = True
                            cv2.rectangle(self.ref_frame, (self.x_start, self.y_start), (x,y), (0,0,255), 2)
                            self.refPt.append((self.x_start, self.y_start))
                            self.refPt.append((x, self.y_start))
                            self.refPt.append((x, y))
                            self.refPt.append((self.x_start, y))

                            roiPoints = [(self.x_start, self.y_start), (x, y)]

                            if len(roiPoints) == 2: #when two points were found
                                    roi = self.ref_frame[roiPoints[0][1]:roiPoints[1][1], roiPoints[0][0]:roiPoints[1][0]]
                                    cv2.imshow("Cropped", roi)


    def maskImg_WithROI(self, frame, ROIPointsList):
            pointsArray = np.array(ROIPointsList)
            mask = np.zeros(frame.shape, dtype=np.uint8)
            white = (255,255,255)
            cv2.fillPoly(mask, np.int32([pointsArray]), white)
            maskedImage = cv2.bitwise_and(frame, mask)
            return maskedImage  

    def outputROIMask(self, frame, ROIPointsList):
            pointsArray = np.array(ROIPointsList)
            pointsArray = pointsArray.reshape((-1,1,2))
            mask = np.zeros(frame.shape, dtype=np.uint8)
            white = (255,255,255)
            cv2.fillPoly(mask, np.int32([pointsArray]), white)
            return mask  

    def main(self):

            self.clickEventsEnabled = True

            self.ref_frame = cv2.imread('picture.png')
            originalRef_Frame = self.ref_frame.copy()

            cv2.namedWindow("ref_frame")
            cv2.setMouseCallback("ref_frame", self.clickPolygonPoints)

            while True:

                    cv2.imshow("ref_frame", self.ref_frame)

                    key = cv2.waitKey(0) & 0xFF

                    if key == ord("r"):
                         self.ref_frame = originalRef_Frame.copy()
                         self.refPt = []
                         self.drawingRectangle = False
                         self.rectangleDrawn = False
                         self.x_start, self.y_start = -1,-1

                    elif key == ord("p"):
                         self.clickEventsEnabled = False
                         self.ref_frame = originalRef_Frame.copy()
                         self.drawingRectangle = False
                         self.rectangleDrawn = False
                         break

                    elif key == ord("q"):
                            break

            self.ref_frame = self.maskImg_WithROI(self.ref_frame, self.refPt)
            cv2.imshow("ref_frame", self.ref_frame)

            roiMask = self.outputROIMask(self.ref_frame, self.refPt)
            cv2.imwrite("ROI.jpg", roiMask)

            cv2.waitKey(0)
            cv2.destroyAllWindows()

if __name__ == '__main__':
    selROI = selectROI()
    selROI.main()`

【讨论】:

    猜你喜欢
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    相关资源
    最近更新 更多