LINUX.ORG.RU

Функция возвращает больше точек, чем от неё требуют

 


0

1

Код красноречивее любых слов.

int MAX_COUNT = 100;
vector<Point2f> points;
goodFeaturesToTrack(gray, points, MAX_COUNT, 0.01, 10, Mat(), 3, 0, 0.04);
goodFeaturesToTrack выделяет особые точки изображения (локальные экстремумы, если я ничего не напутал). И выделить он должен их не больше, чем MAX_COUNT. Да вот беда, после работы функции points.size() выдает вот такую цифирь - 2305842939098389452. Что делать?

★★★

2305842939098389452 - это мусор, а не количество точек. Покажи весь код от точки объявления points до вызова points.size().

fopen ★★
()

Почитать, как правильно задавать вопросы

vonenij
()

https://github.com/arnaudgelas/OpenCVExamples/blob/master/cvMat/GoodFeaturesT...

#include <iostream>

#include "cv.h"
#include "highgui.h"

int main( int argc, char* argv[] )
{
  if( argc != 2 )
    {
    std::cerr << "Usage: " << argv[0] << " <InputImage>" << std::endl;
    return EXIT_FAILURE;
    }

  cv::Mat image = cv::imread( argv[1],0 );

  std::vector< cv::Point2f > corners;

  // maxCorners – The maximum number of corners to return. If there are more corners
  // than that will be found, the strongest of them will be returned
  int maxCorners = 10;

  // qualityLevel – Characterizes the minimal accepted quality of image corners;
  // the value of the parameter is multiplied by the by the best corner quality
  // measure (which is the min eigenvalue, see cornerMinEigenVal() ,
  // or the Harris function response, see cornerHarris() ).
  // The corners, which quality measure is less than the product, will be rejected.
  // For example, if the best corner has the quality measure = 1500,
  // and the qualityLevel=0.01 , then all the corners which quality measure is
  // less than 15 will be rejected.
  double qualityLevel = 0.01;

  // minDistance – The minimum possible Euclidean distance between the returned corners
  double minDistance = 20.;

  // mask – The optional region of interest. If the image is not empty (then it
  // needs to have the type CV_8UC1 and the same size as image ), it will specify
  // the region in which the corners are detected
  cv::Mat mask;

  // blockSize – Size of the averaging block for computing derivative covariation
  // matrix over each pixel neighborhood, see cornerEigenValsAndVecs()
  int blockSize = 3;

  // useHarrisDetector – Indicates, whether to use operator or cornerMinEigenVal()
  bool useHarrisDetector = false;

  // k – Free parameter of Harris detector
  double k = 0.04;

  cv::goodFeaturesToTrack( image, corners, maxCorners, qualityLevel, minDistance, mask, blockSize, useHarrisDetector, k );

  for( size_t i = 0; i < corners.size(); i++ )
    {
    cv::circle( image, corners[i], 10, cv::Scalar( 255. ), -1 );
    }

  cv::namedWindow( argv[1], CV_WINDOW_NORMAL );
  cv::imshow( argv[1], image );
  cv::waitKey(0);

  return EXIT_SUCCESS;
}

Dron ★★★★★
()
Ответ на: комментарий от fopen
#include "opencv2/core/core.hpp"
#include "opencv2/contrib/contrib.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/objdetect/objdetect.hpp"

#include <iostream>
#include <fstream>
#include <sstream>

using namespace cv;
using namespace std;


int main(int argc, char* argv[])
{
	Mat frame, gray;
	VideoCapture capture;
	int dev_id = 0; //Device number.

	capture.open(dev_id);
	if (!capture.isOpened()){
		cerr << "Failed to open video device "
			<< dev_id << " \n" << endl;
		return 1;
	}

	
	while (frame.empty()){
		capture >> frame;
	}
	

	int MAX_COUNT = 10;
	TermCriteria termcrit(TermCriteria::COUNT + TermCriteria::EPS,
		20, 0.3);
	// We use two sets of points in order to swap
	// pointers.
	vector<Point2f> points;
	Size subPixWinSize(10, 10), winSize(100, 100);

	//Convert image to gray scale.
	cvtColor(frame, gray, CV_RGB2GRAY);

	//Feature detection is performed here...
	goodFeaturesToTrack(gray, points, MAX_COUNT, 0.01, 10, Mat(), 3, 0, 0.04);
	try{
		cornerSubPix(gray, points, subPixWinSize, Size(-1, -1), termcrit);
	}
	catch (Exception &e){
		cout << e.msg << endl;
	}
	cout << points.size()<<endl;
	/*for (int i = 0; i < 2000; ++i)
		circle(gray, points[i], 10, Scalar(255, 255, 255));*/
	imshow("Camera check", gray);
	char key = (char)waitKey(0);

	return 0;
}
LIKAN ★★★
() автор топика
Последнее исправление: LIKAN (всего исправлений: 1)
Ответ на: комментарий от LIKAN

Может память зарезервировать надо?

int MAX_COUNT = 100;
vector<Point2f> points;
points.reserve(MAX_COUNT);
goodFeaturesToTrack(gray, points, MAX_COUNT, 0.01, 10, Mat(), 3, 0, 0.04);
Возвращаемое количество брать из MAX_COUNT?

fopen ★★
()
Последнее исправление: fopen (всего исправлений: 1)
Ответ на: комментарий от fopen

Эмм, а метод reserve разве что-то возвращает? http://www.cplusplus.com/reference/vector/vector/reserve/ Знаете, с небольшими значениями MAX_COUNT (MAX_COUNT = 0) помогает. Но если поставить 100, то goodFeaturesToTrack выбрасывает исключение.

LIKAN ★★★
() автор топика
Ответ на: комментарий от LIKAN

reserve память выделяет. Если это не сделать, то нельзя делать ссылки на элементы вектора. Как там внутри goodFeaturesToTrack - я не видел, исходники сходу как-то не смог нагуглить и распарсить.

Так память-то зарезервировал? Какое исключение?

fopen ★★
()
Ответ на: комментарий от fopen

Что то связанное с повреждением кучи (судя по всему памяти как раз не хватает). Странно, что reserve ничего не возвращает, отсюда не ясно, удалось ли ему выделить запрошенный объем или нет.

LIKAN ★★★
() автор топика
Ответ на: комментарий от LIKAN

Что то связанное с повреждением кучи (судя по всему памяти как раз не хватает).

А поточнее. Это принципиально разные вещи. Первое - ошибка в программе, второе - штатное событие.

Странно, что reserve ничего не возвращает, отсюда не ясно, удалось ли ему выделить запрошенный объем или нет.

Это же С++. В нем принято такое исключениями делать. Не было исключения, значит дело сделано.

fopen ★★
()
Ответ на: комментарий от LIKAN

Надо локализовать повреждение памяти: valgrind, или убрать все и добавлять постепенно.

После каждой операции записывай результат в файлы и анализируй.

Короче, обычная такая отладка...

fopen ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.