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

error LNK2019: ссылка на неразрешенный внешний символ...

Recommended Posts

Ребята нужна помощь, я просто уже не знаю что делать, напишите в личку если не сложно http://vk.com/kirviza вот ссылка в контакте, просто расскажу в чем проблема заключается.По книжке я дошел до темы FEATURE2D MODULE. теперь когда подключаю библиотеки #include "opencv2/core/core.hpp"

#include "opencv2/features2d/features2d.hpp", они находятся нормально, но при этом когда запускаю прогу у меня выскакивают ошибоки.

error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall cv::SurfFeatureDetector::SurfFeatureDetector(double,int,int,bool)" (??0SurfFeatureDetector@cv@@QAE@NHH_N@Z) в функции _main

1>proba6.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: virtual __thiscall cv::FeatureDetector::~FeatureDetector(void)" (??1FeatureDetector@cv@@UAE@XZ) в функции "public: virtual __thiscall cv::SurfFeatureDetector::~SurfFeatureDetector(void)" (??1SurfFeatureDetector@cv@@UAE@XZ)

1>proba6.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: virtual __thiscall cv::DescriptorExtractor::~DescriptorExtractor(void)"

я не понимаю как с этим бороться это ужас какой-то, код просто вставил из учебника

#include "stdafx.h"

#include <stdio.h>

#include <iostream>

#include "opencv2/core/core.hpp"

#include "opencv2/features2d/features2d.hpp"

#include "opencv2/highgui/highgui.hpp"


using namespace cv;


void readme();


/** @function main */

int main( int argc, char** argv )

{

  if( argc != 3 )

  { readme(); return -1; }


  Mat img_1 = imread( "image1.jpg", CV_LOAD_IMAGE_GRAYSCALE );

  Mat img_2 = imread( "image2.jpg", CV_LOAD_IMAGE_GRAYSCALE );


  if( !img_1.data || !img_2.data )

  { std::cout<< " --(!) Error reading images " << std::endl; return -1; }


  //-- Step 1: Detect the keypoints using SURF Detector

  int minHessian = 400;


  SurfFeatureDetector detector( minHessian );


  std::vector<KeyPoint> keypoints_1, keypoints_2;


  detector.detect( img_1, keypoints_1 );

  detector.detect( img_2, keypoints_2 );


  //-- Step 2: Calculate descriptors (feature vectors)

  SurfDescriptorExtractor extractor;


  Mat descriptors_1, descriptors_2;


  extractor.compute( img_1, keypoints_1, descriptors_1 );

  extractor.compute( img_2, keypoints_2, descriptors_2 );


  //-- Step 3: Matching descriptor vectors using FLANN matcher

  FlannBasedMatcher matcher;

  std::vector< DMatch > matches;

  matcher.match( descriptors_1, descriptors_2, matches );


  double max_dist = 0; double min_dist = 100;


  //-- Quick calculation of max and min distances between keypoints

  for( int i = 0; i < descriptors_1.rows; i++ )

  { double dist = matches[i].distance;

    if( dist < min_dist ) min_dist = dist;

    if( dist > max_dist ) max_dist = dist;

  }


  printf("-- Max dist : %f \n", max_dist );

  printf("-- Min dist : %f \n", min_dist );


  //-- Draw only "good" matches (i.e. whose distance is less than 2*min_dist )

  //-- PS.- radiusMatch can also be used here.

  std::vector< DMatch > good_matches;


  for( int i = 0; i < descriptors_1.rows; i++ )

  { if( matches[i].distance < 2*min_dist )

    { good_matches.push_back( matches[i]); }

  }


  //-- Draw only "good" matches

  Mat img_matches;

  drawMatches( img_1, keypoints_1, img_2, keypoints_2,

               good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),

               vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );


  //-- Show detected matches

  imshow( "Good Matches", img_matches );


  for( int i = 0; i < good_matches.size(); i++ )

  { printf( "-- Good Match [%d] Keypoint 1: %d  -- Keypoint 2: %d  \n", i, good_matches[i].queryIdx, good_matches[i].trainIdx ); }


  waitKey(0);


  return 0;

}


/** @function readme */

void readme()

{ std::cout << " Usage: ./SURF_FlannMatcher <img1> <img2>" << std::endl; }

все что в нем поменял это вместо аргументов сразу написал имена изображений

  • Like 1

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


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

дык lib файлы не все подключены

думаю что не хватает opencv_features2d249.lib

может быть еще opencv_nonfree249.lib, там surf.

  • Like 1

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


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

дык lib файлы не все подключены

думаю что не хватает opencv_features2d249.lib

может быть еще opencv_nonfree249.lib, там surf.

так что подключить надо?я не пойму какой именно файл?наверное я глупый, просто их тут много с таким названием и у меня нет features2d249, есть тоже самое но 231

  • Like 1

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


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

c 231 тоже пойдет, эти три цифры обозначают версию.

Если подключите все, большой беды не будет.

Мне обычно хватает этого:

opencv_calib3d249.lib

opencv_contrib249.lib

opencv_core249.lib

opencv_features2d249.lib

opencv_flann249.lib

opencv_highgui249.lib

opencv_imgproc249.lib

opencv_legacy249.lib

opencv_ml249.lib

opencv_nonfree249.lib

opencv_objdetect249.lib

opencv_photo249.lib

opencv_stitching249.lib

opencv_ts249.lib

opencv_video249.lib

opencv_videostab249.lib

  • Like 1

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


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

с этим разобрался, спасибо огромное но тут же возникла другая ошибка, почему то подчеркивает SurfFeatureDetector.вот внизу скрин.

post-6211-0-54724600-1358780520_thumb.pn

  • Like 1

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


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

заголовочнки тоже нужны


#include "opencv2/core/core.hpp"
#include "opencv2/core/gpumat.hpp"
#include "opencv2/core/opengl_interop.hpp"
#include "opencv2/ml/ml.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/contrib/contrib.hpp"
#include "opencv2/video/tracking.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/nonfree/nonfree.hpp"
[/code]

может какие и забыл, этого мне обычно хватает.

  • Like 1

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


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

спасибо огромное, конечно все равно ничего не работает) но теперь хотя бы ошибки не выдает и разобрался с библиотеками, что и как.

теперь помогите решить последнюю проблему, просто по рабочей проге легче разобраться как работает каждая функция.

Вот код, что тут не так.

#include "stdafx.h"

#include <stdio.h>

#include <iostream>

#include "opencv2/core/core.hpp"

#include "opencv2/core/gpumat.hpp"

#include "opencv2/core/opengl_interop.hpp"

#include "opencv2/ml/ml.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/contrib/contrib.hpp"

#include "opencv2/video/tracking.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include "opencv2/nonfree/nonfree.hpp"


using namespace cv;


void readme();


/** @function main */

int main( int argc, char** argv )

{

  if( argc != 3 )

  { readme(); return -1; }


  Mat img_1 = imread( "image1.jpg", CV_LOAD_IMAGE_GRAYSCALE );

  Mat img_2 = imread( "image2.jpg", CV_LOAD_IMAGE_GRAYSCALE );


  if( !img_1.data || !img_2.data )

  { std::cout<< " --(!) Error reading images " << std::endl; return -1; }


  //-- Step 1: Detect the keypoints using SURF Detector

  int minHessian = 400;


  SurfFeatureDetector detector( minHessian );


  std::vector<KeyPoint> keypoints_1, keypoints_2;


  detector.detect( img_1, keypoints_1 );

  detector.detect( img_2, keypoints_2 );


  //-- Step 2: Calculate descriptors (feature vectors)

  SurfDescriptorExtractor extractor;


  Mat descriptors_1, descriptors_2;


  extractor.compute( img_1, keypoints_1, descriptors_1 );

  extractor.compute( img_2, keypoints_2, descriptors_2 );


  //-- Step 3: Matching descriptor vectors using FLANN matcher

  FlannBasedMatcher matcher;

  std::vector< DMatch > matches;

  matcher.match( descriptors_1, descriptors_2, matches );


  double max_dist = 0; double min_dist = 100;


  //-- Quick calculation of max and min distances between keypoints

  for( int i = 0; i < descriptors_1.rows; i++ )

  { double dist = matches[i].distance;

    if( dist < min_dist ) min_dist = dist;

    if( dist > max_dist ) max_dist = dist;

  }


  printf("-- Max dist : %f \n", max_dist );

  printf("-- Min dist : %f \n", min_dist );


  //-- Draw only "good" matches (i.e. whose distance is less than 2*min_dist )

  //-- PS.- radiusMatch can also be used here.

  std::vector< DMatch > good_matches;


  for( int i = 0; i < descriptors_1.rows; i++ )

  { if( matches[i].distance < 2*min_dist )

    { good_matches.push_back( matches[i]); }

  }


  //-- Draw only "good" matches

  Mat img_matches;

  drawMatches( img_1, keypoints_1, img_2, keypoints_2,

               good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),

               vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );


  //-- Show detected matches

  imshow( "Good Matches", img_matches );


  for( int i = 0; i < good_matches.size(); i++ )

  { printf( "-- Good Match [%d] Keypoint 1: %d  -- Keypoint 2: %d  \n", i, good_matches[i].queryIdx, good_matches[i].trainIdx ); }


  waitKey(0);


  return 0;

 }


 /** @function readme */

 void readme()

 { std::cout << " Usage: ./SURF_FlannMatcher <img1> <img2>" << std::endl; }

вот что должно получится (1 изображение)

я использую вот эти изображения (2,3 изображение)

и что мне выдает прога (4 изображение)

что не так тут, я не пойму)

post-6211-0-96069000-1358805384_thumb.jp

post-6211-0-75914700-1358805400_thumb.jp

post-6211-0-39724600-1358805412_thumb.jp

post-6211-0-84072300-1358805567_thumb.jp

  • Like 1

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


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

уберите

 if( argc != 3 )
{ readme(); return -1; }[/code]

argc имеет значение, равное количеству аргументов в командной строке.

Здесь говорится, что если количество аргументов командной строки не равно трем (первый это путь где лежит экзешник, он формируется автоматически остальные два - это имена файлов, которые Вы ввели константой), то завершить программу.

  • Like 1

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


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

Вот я убрал эти строки, вот что оставил

#include "stdafx.h"

#include <stdio.h>

#include <iostream>

#include "opencv2/core/core.hpp"

#include "opencv2/core/gpumat.hpp"

#include "opencv2/core/opengl_interop.hpp"

#include "opencv2/ml/ml.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/contrib/contrib.hpp"

#include "opencv2/video/tracking.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include "opencv2/nonfree/nonfree.hpp"


using namespace cv;


int main( int argc, char** argv )

{


  Mat img_1 = imread( "image1.jpg", CV_LOAD_IMAGE_GRAYSCALE );

  Mat img_2 = imread( "image2.jpg", CV_LOAD_IMAGE_GRAYSCALE );


  if( !img_1.data || !img_2.data )

  { std::cout<< " --(!) Error reading images " << std::endl; return -1; }


  //-- Step 1: Detect the keypoints using SURF Detector

  int minHessian = 400;


  SurfFeatureDetector detector( minHessian );


  std::vector<KeyPoint> keypoints_1, keypoints_2;


  detector.detect( img_1, keypoints_1 );

  detector.detect( img_2, keypoints_2 );


  //-- Step 2: Calculate descriptors (feature vectors)

  SurfDescriptorExtractor extractor;


  Mat descriptors_1, descriptors_2;


  extractor.compute( img_1, keypoints_1, descriptors_1 );

  extractor.compute( img_2, keypoints_2, descriptors_2 );


  //-- Step 3: Matching descriptor vectors using FLANN matcher

  FlannBasedMatcher matcher;

  std::vector< DMatch > matches;

  matcher.match( descriptors_1, descriptors_2, matches );


  double max_dist = 0; double min_dist = 100;


  //-- Quick calculation of max and min distances between keypoints

  for( int i = 0; i < descriptors_1.rows; i++ )

  { double dist = matches[i].distance;

    if( dist < min_dist ) min_dist = dist;

    if( dist > max_dist ) max_dist = dist;

  }


  printf("-- Max dist : %f \n", max_dist );

  printf("-- Min dist : %f \n", min_dist );


  //-- Draw only "good" matches (i.e. whose distance is less than 2*min_dist )

  //-- PS.- radiusMatch can also be used here.

  std::vector< DMatch > good_matches;


  for( int i = 0; i < descriptors_1.rows; i++ )

  { if( matches[i].distance < 2*min_dist )

    { good_matches.push_back( matches[i]); }

  }


  //-- Draw only "good" matches

  Mat img_matches;

  drawMatches( img_1, keypoints_1, img_2, keypoints_2,

               good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),

               vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );


  //-- Show detected matches

  imshow( "Good Matches", img_matches );


  for( int i = 0; i < good_matches.size(); i++ )

  { printf( "-- Good Match [%d] Keypoint 1: %d  -- Keypoint 2: %d  \n", i, good_matches[i].queryIdx, good_matches[i].trainIdx ); }


  waitKey(0);


  return 0;

 }

все равно жалуется что не загруженны изображения, но почему они не загружены, я же чисто имена прописал и кинул их в корень проекта. я еще пробовал вместе imread писать cvLoadImage, так мне показывается что изображения считанны, но потом все равно вылетает ошибка

  • Like 1

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


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

Если запускать из студии, то рабочая директория, по умолчанию, не та в которой файл лежит, а изображения ищутся именно в рабочей директории.

Попробуйте запустить его просто, отдельно, из windows.

Или укажите полный путь к файлам.

  • Like 1

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


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

исправил ошибку с загрузкой изображений просто imread поменял на cvLoadImage,

теперь другая ошибка, при запуске вылетает как только доходит до

int minHessian = 400;

  SurfFeatureDetector detector( minHessian );

  std::vector<KeyPoint> keypoints_1, keypoints_2;

  detector.detect( img_1, keypoints_1 );

  detector.detect( img_2, keypoints_2 );
в чем тут проблема уже? я наверное скоро повешусь, мне интересно зачем такие учебники делать, или я слишком тупой. причем беру так же пример matching_simple.cpp там те же самые ошибки выводит. вот весь код исправленный что теперь в нем не так
#include "stdafx.h"

#include <stdio.h>

#include <iostream>

#include "opencv2/core/core.hpp"

#include "opencv2/core/gpumat.hpp"

#include "opencv2/core/opengl_interop.hpp"

#include "opencv2/ml/ml.hpp"

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/contrib/contrib.hpp"

#include "opencv2/video/tracking.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include "opencv2/nonfree/nonfree.hpp"


using namespace cv;


int main( int argc, char** argv )

{


    Ptr<IplImage> img1 = cvLoadImage("image1.jpg", CV_LOAD_IMAGE_GRAYSCALE);

    Ptr<IplImage> img2 = cvLoadImage("image2.jpg", CV_LOAD_IMAGE_GRAYSCALE);

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

    {

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

        return -1;

    }

    Mat img_1(img1);

    Mat img_2(img2);


  //-- Step 1: Detect the keypoints using SURF Detector

  int minHessian = 400;


  SurfFeatureDetector detector( minHessian );


  std::vector<KeyPoint> keypoints_1, keypoints_2;


  detector.detect( img_1, keypoints_1 );

  detector.detect( img_2, keypoints_2 );


  //-- Step 2: Calculate descriptors (feature vectors)

  SurfDescriptorExtractor extractor;


  Mat descriptors_1, descriptors_2;


  extractor.compute( img_1, keypoints_1, descriptors_1 );

  extractor.compute( img_2, keypoints_2, descriptors_2 );


  //-- Step 3: Matching descriptor vectors using FLANN matcher

  FlannBasedMatcher matcher;

  std::vector< DMatch > matches;

  matcher.match( descriptors_1, descriptors_2, matches );


  double max_dist = 0; double min_dist = 100;


  //-- Quick calculation of max and min distances between keypoints

  for( int i = 0; i < descriptors_1.rows; i++ )

  { double dist = matches[i].distance;

    if( dist < min_dist ) min_dist = dist;

    if( dist > max_dist ) max_dist = dist;

  }


  printf("-- Max dist : %f \n", max_dist );

  printf("-- Min dist : %f \n", min_dist );


  //-- Draw only "good" matches (i.e. whose distance is less than 2*min_dist )

  //-- PS.- radiusMatch can also be used here.

  std::vector< DMatch > good_matches;


  for( int i = 0; i < descriptors_1.rows; i++ )

  { if( matches[i].distance < 2*min_dist )

    { good_matches.push_back( matches[i]); }

  }


  //-- Draw only "good" matches

  Mat img_matches;

  drawMatches( img_1, keypoints_1, img_2, keypoints_2,

               good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),

               vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );


  //-- Show detected matches

  imshow( "Good Matches", img_matches );


  for( int i = 0; i < good_matches.size(); i++ )

  { printf( "-- Good Match [%d] Keypoint 1: %d  -- Keypoint 2: %d  \n", i, good_matches[i].queryIdx, good_matches[i].trainIdx ); }


  waitKey(0);


  return 0;

 }

что тут не так?помогите пожалуйста, или если есть рабочий пример такого же характера скиньте его. А то реально повешусь дня через 2))))

  • Like 1

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


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

У меня пример matcher_simple.cpp из папки opencv\samples\cpp\ ( его бинарники находится в OpenCV\bin\Debug\ и OpenCV\bin\Release\)

Работает нормально. См. скрин, там есть и командная строка, как проверить.

Если этот пример не работает, значит что то не то с библиотекой, у меня были подобные ошибки, связано это было вроде с TBB.

post-1-0-84893200-1358856192_thumb.png

  • Like 1

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


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

все разобрался,проблема была в самом opencv, в версии. спасибо огромное. зато теперь шарю как библиотеки подключать и что куда тыкать.А то я сами алгоритмы могу немного реализовывать а как что устроенно не знал. даже не знаю как отблагодарить вас.Буду теперь постоянно на форуме у вас зависать и стараться так же помогать другим))если знания будут позволять)

  • Like 1

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×