Использование OpenCV в соответствии с изображением из группы изображений с целью идентификации в C ++C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Использование OpenCV в соответствии с изображением из группы изображений с целью идентификации в C ++

Сообщение Anonymous »

РЕДАКТИРОВАТЬ: Я приобрел достаточно репутации через этот пост, чтобы иметь возможность редактировать его с помощью дополнительных ссылок, что поможет мне получить свою точку зрения на лучшее

Люди, играющие в привязке Исаака, часто сталкиваются с важными элементами на маленьких постамах. /> < /p>

Цель состоит в том, чтобы пользователь запутался в том, какой элемент сможет нажать кнопку, которая затем поручит ему «поставить» элемент (подумайте о боксе на рабочем столе Windows). Коробка дает нам область интереса (фактический элемент плюс некоторая фоновая среда) для сравнения с тем, что будет целой сеткой предметов. < /p>

Теоретический элемент пользовательского блока
< /p>

Теоретическая сетка (я не так много, что я не знаю, что это не так, как это не так, я просто />

Место в сетке элементов, идентифицированное как элемент, который в котором пользователь -блокировка будет представлять определенную область на изображении, которое коррелирует с собственной ссылкой, которая будет представлять собой/piki, которая будет представлять собой/piki, который будет представлять (с ими, которая будет представлять собой/pik. />
В сетке элемент - 1 -й столбец 3 -й из нижнего ряда. Я использую эти два изображения во всех вещах, которые я пробовал ниже < /p>



Моя цель - создать программу, которая может взять ручной культуру предмета из игры «Связывание Isaac», определить обрезанный элемент, обнаружив, что сравнивая изображение с изображением таблицы элементов в игре, затем отображает правильный Wiki. Было бы моим первым «настоящим проектом» в том смысле, что требует огромного количества библиотеки, чтобы получить то, что я хочу сделать. Это было немного ошеломляюще. (Вы можете быстро найти учебники, которые я использовал, поиск имени метода и OpenCV. Моя учетная запись сильно ограничена публикацией ссылок по какой -то причине) />http://docs.opencv.org/doc/tutoriors/fe ... ption.html

#include
#include
#include "opencv2/core/core.hpp"
#include
#include
#include "opencv2/highgui/highgui.hpp"

using namespace cv;

void readme();

/** @function main */
int main( int argc, char** argv )
{
if( argc != 3 )
{ return -1; }

Mat img_1 = imread( argv[1], CV_LOAD_IMAGE_GRAYSCALE );
Mat img_2 = imread( argv[2], CV_LOAD_IMAGE_GRAYSCALE );

if( !img_1.data || !img_2.data )
{ return -1; }

//-- Step 1: Detect the keypoints using SURF Detector
int minHessian = 400;

SurfFeatureDetector detector( minHessian );

std::vector 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 with a brute force matcher
BruteForceMatcher< L2 > matcher;
std::vector< DMatch > matches;
matcher.match( descriptors_1, descriptors_2, matches );

//-- Draw matches
Mat img_matches;
drawMatches( img_1, keypoints_1, img_2, keypoints_2, matches, img_matches );

//-- Show detected matches
imshow("Matches", img_matches );

waitKey(0);

return 0;
}

/** @function readme */
void readme()
{ std::cout

Результаты не так полезны. Чистые, но одинаково ненадежные результаты, используя Flann.

http://docs.opencv.org/doc/tutorials/fe ... er.htmlbr/>
#include
#include
#include "opencv2/core/core.hpp"
#include
#include
#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( argv[1], CV_LOAD_IMAGE_GRAYSCALE );
Mat img_2 = imread( argv[2], CV_LOAD_IMAGE_GRAYSCALE );

if( !img_1.data || !img_2.data )
{ std::cout 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.distance < 2*min_dist )
{ good_matches.push_back( matches); }
}

//-- 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(), 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.queryIdx, good_matches.trainIdx ); }

waitKey(0);

return 0;
}

/** @function readme */
void readme()
{ std::cout

TemplateMatching - мой лучший метод. Из 6 методов он варьируется от получения только 0-4 правильных идентификаций.#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include
#include

using namespace std;
using namespace cv;

/// Global Variables
Mat img; Mat templ; Mat result;
char* image_window = "Source Image";
char* result_window = "Result window";

int match_method;
int max_Trackbar = 5;

/// Function Headers
void MatchingMethod( int, void* );

/** @function main */
int main( int argc, char** argv )
{
/// Load image and template
img = imread( argv[1], 1 );
templ = imread( argv[2], 1 );

/// Create windows
namedWindow( image_window, CV_WINDOW_AUTOSIZE );
namedWindow( result_window, CV_WINDOW_AUTOSIZE );

/// Create Trackbar
char* trackbar_label = "Method: \n 0: SQDIFF \n 1: SQDIFF NORMED \n 2: TM CCORR \n 3: TM CCORR NORMED \n 4: TM COEFF \n 5: TM COEFF NORMED";
createTrackbar( trackbar_label, image_window, &match_method, max_Trackbar, MatchingMethod );

MatchingMethod( 0, 0 );

waitKey(0);
return 0;
}

/**
* @function MatchingMethod
* @brief Trackbar callback
*/
void MatchingMethod( int, void* )
{
/// Source image to display
Mat img_display;
img.copyTo( img_display );

/// Create the result matrix
int result_cols = img.cols - templ.cols + 1;
int result_rows = img.rows - templ.rows + 1;

result.create( result_cols, result_rows, CV_32FC1 );

/// Do the Matching and Normalize
matchTemplate( img, templ, result, match_method );
normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() );

/// Localizing the best match with minMaxLoc
double minVal; double maxVal; Point minLoc; Point maxLoc;
Point matchLoc;

minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );

/// For SQDIFF and SQDIFF_NORMED, the best matches are lower values. For all the other methods, the higher the better
if( match_method == CV_TM_SQDIFF || match_method == CV_TM_SQDIFF_NORMED )
{ matchLoc = minLoc; }
else
{ matchLoc = maxLoc; }

/// Show me what you got
rectangle( img_display, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 );
rectangle( result, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 );

imshow( image_window, img_display );
imshow( result_window, result );

return;
}
< /code>

https://i.sstatic.net/ncbpw.png

из 6
Fail, пройти, пройти, пройти, пройти, пройти < /p>

Это был лучший результат. Следующий элемент, который я попробовал, был < /p>

и результаты с провалом, провал, провал, пройденный, провал < /p>

из пункта, что все это работает, и некоторые из них, что не так, как некоторые из них, и некоторые из них, и некоторые из них, что некоторые из них не будут. ужасно < /p>

Поэтому я спрошу: Является ли Templatematching моей лучшей ставки или есть метод, который я не рассматриваю, это будет мой святой Грааль? Документация OpenCV об этом действительно плохая, и примерами, которые я нахожу в Интернете, являются чрезвычайно старые CPP или прямой c. < /P>

Спасибо за любую помощь. Это предприятие до сих пор было интересным опытом. Мне пришлось лишить все ссылки, которые лучше изобразили бы, как все работает, но сайт говорит, что я публикую более 10 ссылок, даже когда я не. Такие элементы, как Rock, являются причиной, по которой обрезка элемента по пользователю является лучшим способом изоляции элемента, в противном случае их позиции находятся только в нескольких конкретных местах. Описание изображения здесь "src =" https://i.sstatic.net/ucy8x.png "/>

Предмет после боя с боссом, много вещей повсюду и прозрачность в середине. Я предполагаю, что это одно из самых сложных для правильной работы < /p>

< /p>

< /p>

Вот две таблицы. />


Подробнее здесь: https://stackoverflow.com/questions/147 ... dentificat
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»