Перейти к содержимому
Compvision.ru
megabax

Детекторы особых точек

Recommended Posts

Добрый день.

Поделитесь, пожалуйста примерами различных детекторов особых точек на OpenCV.

Я тут где-то находил вот такой пример Ши Тамаши:

// OpenSVDemo.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace cv;
using namespace std;

/// Global variables
Mat src, src_gray;

int maxCorners = 23;
int maxTrackbar = 100;

RNG rng(12345);
char* source_window = "Image";

/// Function header
void goodFeaturesToTrack_Demo( int, void* );

/**
 * @function main
 */
int main( int argc, char** argv )
{
  /// Load source image and convert it to gray
  //src = imread( argv[1], 1 );
  src = imread("d:\\3\\10300013.png", 1 );
  cvtColor( src, src_gray, CV_BGR2GRAY );

  /// Create Window
  namedWindow( source_window, CV_WINDOW_AUTOSIZE );

  /// Create Trackbar to set the number of corners
  createTrackbar( "Max  corners:", source_window, &maxCorners, maxTrackbar, goodFeaturesToTrack_Demo );

  imshow( source_window, src );

  goodFeaturesToTrack_Demo( 0, 0 );

  waitKey(0);
  return(0);
}

/**
 * @function goodFeaturesToTrack_Demo.cpp
 * @brief Apply Shi-Tomasi corner detector
 */
void goodFeaturesToTrack_Demo( int, void* )
{
  if( maxCorners < 1 ) { maxCorners = 1; }

  /// Parameters for Shi-Tomasi algorithm
  vector<Point2f> corners;
  double qualityLevel = 0.01;
  double minDistance = 10;
  int blockSize = 3;
  bool useHarrisDetector = false;
  double k = 0.04;

  /// Copy the source image
  Mat copy;
  copy = src.clone();

  /// Apply corner detection
  goodFeaturesToTrack( src_gray,
               corners,
               maxCorners,
               qualityLevel,
               minDistance,
               Mat(),
               blockSize,
               useHarrisDetector,
               k );


  /// Draw corners detected
  cout<<"** Number of corners detected: "<<corners.size()<<endl;
  int r = 4;
  for( int i = 0; i < corners.size(); i++ )
     { circle( copy, corners[i], r, Scalar(rng.uniform(0,255), rng.uniform(0,255),
              rng.uniform(0,255)), -1, 8, 0 ); }

  /// Show what you got
  namedWindow( source_window, CV_WINDOW_AUTOSIZE );
  imshow( source_window, copy );
}

но он почему то вылетает на строке cout<<"** Number of corners detected: "<<corners.size()<<endl;

с сообщением:

"

ОС Windows инициировала точку останова в SpecificPoints.exe.
Это может быть вызвано повреждением кучи и указывает на ошибку в SpecificPoints.exe или в одной из загруженных им DLL.
Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит SpecificPoints.exe
Выведенное на экран окно содержит дополнительные данные для диагностики ошибки"
Подскажите пожалуйста, как лечить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не силен в С++, но думаю что вам нужно переменную corners перевести в другой формат для вывода, например в List<Point>

в джава например так и приходится делать, гонять между List<Point> (для вывода и удобной работы по сортировке) и MatOfPoint2f (для работы функций OpenCV)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот пример из мануала:

 

Цитата

 


vector<Vec3f> circles;

...

Draw the detected circles:


for( size_t i = 0; i < circles.size(); i++ )
{
   Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
   int radius = cvRound(circles[i][2]);
   // circle center
   circle( src, center, 3, Scalar(0,255,0), -1, 8, 0 );
   // circle outline
   circle( src, center, radius, Scalar(0,0,255), 3, 8, 0 );
 }

 

Вам нужно сделать по аналогии

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Возможно, возникла путаница в Debug|Release сборках.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×