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

Примеры из opencv

Recommended Posts

Добрый день, пытался запустить готовые детекторы из примеров, но что-то не особо получилось пример matcher_simple.cpp

ниже тот же код что и в примере


#include <stdio.h>

#include <opencv2/core/core.hpp>

#include <opencv2/features2d/features2d.hpp>

#include <opencv2/highgui/highgui.hpp>


using namespace cv;


void help()

{

	printf("\nThis program demonstrates using features2d detector, descriptor extractor and simple matcher\n"

			"Using the SURF desriptor:\n"

			"\n"

			"Usage:\n matcher_simple <image1> <image2>\n");

}


int main(int argc, char** argv)

{

	if(argc != 3)

	{

		help();

		return -1;

	}


	Mat img1 = imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE);

	Mat img2 = imread(argv[2], CV_LOAD_IMAGE_GRAYSCALE);

	if(img1.empty() || img2.empty())

	{

		printf("Can't read one of the images\n");

		return -1;

	}


	// detecting keypoints

	SurfFeatureDetector detector();

	vector<KeyPoint> keypoints1, keypoints2;

	detector.detect(img1, keypoints1);

	detector.detect(img2, keypoints2);


	// computing descriptors

	SurfDescriptorExtractor extractor;

	Mat descriptors1, descriptors2;

	extractor.compute(img1, keypoints1, descriptors1);

	extractor.compute(img2, keypoints2, descriptors2);


	// matching descriptors

	BruteForceMatcher<L2<float> > matcher;

    vector<DMatch> matches;

    matcher.match(descriptors1, descriptors2, matches);


	// drawing the results

	namedWindow("matches", 1);

	Mat img_matches;

	drawMatches(img1, keypoints1, img2, keypoints2, matches, img_matches);

	imshow("matches", img_matches);

	waitKey(0);


	return 0;

}

получил следующую ошибку
Ошибка 2 error C2228: выражение слева от ".detect" должно представлять класс, структуру или объединение c:\documents and settings\мои документы\visual studio 2010\projects\testsapp\testsapp\testsapp.cpp 40 1 testsApp
после исправления, исправленный код ниже

	// detecting keypoints

	SurfFeatureDetector  detector();

	vector<KeyPoint> keypoints1, keypoints2;

	detector().detect(img1, keypoints1);

	detector().detect(img2, keypoints2);


	// computing descriptors

	SurfDescriptorExtractor extractor();

	Mat descriptors1, descriptors2;

	extractor().compute(img1, keypoints1, descriptors1);

	extractor().compute(img2, keypoints2, descriptors2);


	// matching descriptors

	BruteForceMatcher<L2<float> > matcher();

    vector<DMatch> matches;

    matcher().match(descriptors1, descriptors2, matches);


	// drawing the results

	namedWindow("matches", 1);

	Mat img_matches;

	drawMatches(img1, keypoints1, img2, keypoints2, matches, img_matches);

	imshow("matches", img_matches);

	waitKey(0);

получил следующую ошибку

Ошибка 2 error LNK2019: ссылка на неразрешенный внешний символ "void __cdecl cv::drawMatches(class cv::Mat const &,class std::vector<class cv::KeyPoint,class std::allocator<class cv::KeyPoint> > const &,class cv::Mat const &,class std::vector<class cv::KeyPoint,class std::allocator<class cv::KeyPoint> > const &,class std::vector<struct cv::DMatch,class std::allocator<struct cv::DMatch> > const &,class cv::Mat &,class cv::Scalar_<double> const &,class cv::Scalar_<double> const &,class std::vector<char,class std::allocator<char> > const &,int)" (?drawMatches@cv@@YAXABVMat@1@ABV?$vector@VKeyPoint@cv@@V?$allocator@VKeyPoint@cv@@@std@@@std@@01ABV?$vector@UDMatch@cv@@V?$allocator@UDMatch@cv@@@std@@@4@AAV21@ABV?$Scalar_@N@1@4ABV?$vector@DV?$allocator@D@std@@@4@H@Z) в функции _wmain c:\documents and settings\мои документы\visual studio 2010\Projects\testsApp\testsApp\testsApp.obj testsApp

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


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

...LNK2019: ссылка на неразрешенный внешний символ... ошибка линкера - значит, скорее всего, не подключена какая-то либа.

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


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

а что за либа может быть не подключена.. в доп зависимостях у меня следующие

C:\OpenCV2.2\lib\opencv_core220d.lib

C:\OpenCV2.2\lib\opencv_highgui220d.lib

C:\OpenCV2.2\lib\opencv_video220d.lib

C:\OpenCV2.2\lib\opencv_ml220d.lib

C:\OpenCV2.2\lib\opencv_legacy220d.lib

C:\OpenCV2.2\lib\opencv_imgproc220d.lib

а в инклудах


#include <stdio.h>

#include <opencv2/core/core.hpp>

#include <opencv2/features2d/features2d.hpp>

#include <opencv2/highgui/highgui.hpp>

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


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

Лень проверять, но скорее всего одна из:

(у меня версия 2.32)

opencv_features2d232.lib

opencv_objdetect232.lib

opencv_flann232.lib

Я обычно все вписываю :)

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


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

Большое спасибо, всё получилось

у меня сейчас такой вопрос, какие пороги надо писать в сифте

SiftFeatureDetector detector();

я пробовал так SiftFeatureDetector detector(40, 70); но никакого drawMatches не отображалось.. наверно пороги нужно брать другие?..

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


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

и у меня возник ещё вопрос для сопоставления дескрипторов я сейчас использую метод ближайших соседей встроенный у flann


        int knn=5;

        FlannBasedMatcher matchr;

	vector<DMatch> matches;

	matchr.knnMatch(descriptors1,descriptors2,matches,knn);

он выдаёт ошибку, что может быть не так...

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


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

По поводу порогов, можно сделать их адаптивными.

То есть:

Ставите сначала произвольно.

Если детектируется меньше SIFT особенностей чем надо, снижаете порог (скажем на 5%).

Если больше, то повышаете.

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×