Как извлечь ключевые точки из Harris Corner Detector с помощью Opencv

  • Сначала я бы использовал cv::cornerHarris() для обнаружения углов (что я мог бы сделать легко).
  • Во-вторых, я хочу извлечь ключевые точки из детектора Харриса и сохранить их в std::vector<KeyPoint> (что я понятия не имею, как это сделать). Я буду использовать это позже, чтобы вычислить дескрипторы и сопоставить их.
  • Я мог бы сделать их с помощью SURF довольно легко, но я хочу сделать это с угловым детектором Харриса.

    /// Detecting corners
    cv::cornerHarris(leftRoi, dst, blockSize, apertureSize, k, BORDER_DEFAULT);
    
    /// Normalizing
    normalize(dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat());
    convertScaleAbs(dst_norm, dst_norm_scaled);
    
    /// Drawing a circle around corners
    for (int j = 0; j < dst_norm.rows; j++)
    {
        for (int i = 0; i < dst_norm.cols; i++)
        {
            if ((int)dst_norm.at<float>(j, i) > 165)
            {
    
                circle(dst_norm_scaled, Point(i, j), 5, Scalar(0), 2, 8, 0);
            }
        }
    }
    /// Showing the result
    namedWindow("corners_window", CV_WINDOW_AUTOSIZE);
    imshow("corners_window", dst_norm_scaled);
    

- Возникла проблема с этой частью (Как извлечь ключевые точки из вышеприведенного детектора Харриса)

    std::vector<KeyPoint> keypoints;

person code monk    schedule 15.05.2018    source источник


Ответы (2)


питон

Вот как я написал это на Python:

# convert coordinates to Keypoint type
eye_corner_keypoints = [cv2.KeyPoint(crd[0], crd[1], 13) for crd in eye_corner_coordinates]

# compute SIFT descriptors from corner keypoints
sift = cv2.xfeatures2d.SIFT_create()
eye_corner_descriptors = [sift.compute(gray,[kp])[1] for kp in eye_corner_keypoints]

C++

Просмотр подписи конструктора в справочной документации OpenCV для класса KeyPoint :

KeyPoint (float x, float y, float _size, float _angle=-1, float _response=0, int _octave=0, int _class_id=-1)

Похоже, вы можете перебирать свои координатные точки и создавать объекты KeyPoint на каждой итерации (примерно) следующим образом:

for (int i = 0; i < num_points; i++) {
    KeyPoint kp(points_x[i], points_y[i], points_size[i]);
    /* ... */

Внимание: код не проверен, я не программист на C++.

person Roman Smirnov    schedule 13.11.2018

person    schedule
comment
Требуется некоторое дополнительное объяснение, иначе вы рискуете попасть в угол низкого качества ботов, где они подают ответы только с чистым кодом тем, кто проголосовал против ;-) (из обзора). - person ZF007; 20.07.2019