1

Я пытаюсь совместить два изображения с одним снимком экрана мобильного экрана, а изображение шаблона - любое приложение. Если я сопоставляю исходный код и шаблон, обрезанный с одних и тех же изображений, он идеально подходит. Но когда я использую значок приложения, обрезанный с другого мобильного экрана он не соответствует должным образом.Функция соответствия Opencv неправильно подходит для обрезанных изображений разных размеров и изображений, взятых из разных источников?

Для согласования изображений трудится на следующий коде:

int main(int argc, char** argv) 
{ 

Mat objectImg = imread("source.jpg", cv::IMREAD_GRAYSCALE); 
Mat sceneImg = imread("note4-3.jpg", cv::IMREAD_GRAYSCALE); 

//cv::resize(sceneImg,sceneImg,objectImg.size(),0,0,CV_INTER_CUBIC); 

if(!objectImg.data || !sceneImg.data) 
{ 
    printf(" No image data \n "); 
    return -1337; 
} 

std::vector<cv::KeyPoint> objectKeypoints; 
std::vector<cv::KeyPoint> sceneKeypoints; 
cv::Mat objectDescriptors; 
cv::Mat sceneDescriptors; 

Ptr<FeatureDetector> detector; 
detector = cv::MSER::create(); 
detector->detect(objectImg, objectKeypoints); 
detector->detect(sceneImg, sceneKeypoints); 

Ptr<DescriptorExtractor> extractor = cv::ORB::create(); 
extractor->compute(objectImg, objectKeypoints, objectDescriptors); 
extractor->compute(sceneImg, sceneKeypoints, sceneDescriptors); 

if(objectDescriptors.type()!=CV_32F) { 
objectDescriptors.convertTo(objectDescriptors, CV_32F); 
} 

if(sceneDescriptors.type()!=CV_32F) { 
sceneDescriptors.convertTo(sceneDescriptors, CV_32F); 
} 

vector< vector<DMatch> > matches; 
Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce"); 
matcher->knnMatch(objectDescriptors, sceneDescriptors, matches, 8); 

double max_dist = 0; double min_dist = 100; 

//-- Quick calculation of max and min distances between keypoints 
for(int i = 0; i < objectDescriptors.rows; i++) 
{ 
    double dist = matches[i][0].distance; 
    if(dist < min_dist) min_dist = dist; 
    if(dist > max_dist) max_dist = dist; 
} 

std::vector<cv::DMatch> good_matches; 

for(int i = 0; i < objectDescriptors.rows; i++) 
{ 
    if(matches[i][0].distance <= max(2*min_dist, 0.02)) { 
     good_matches.push_back(matches[i][0]); 
    } 

} 

//look whether the match is inside a defined area of the image 
//only 25% of maximum of possible distance 
/*double tresholdDist = 0.50 * sqrt(double(sceneImg.size().height*sceneImg.size().height + sceneImg.size().width*sceneImg.size().width)); 

vector<DMatch> good_matches2; 
good_matches2.reserve(matches.size()); 
for (size_t i = 0; i < matches.size(); ++i) 
{ 
    for (int j = 0; j < matches[i].size(); j++) 
    { 
     Point2f from = objectKeypoints[matches[i][j].queryIdx].pt; 
     Point2f to = sceneKeypoints[matches[i][j].trainIdx].pt; 

     //calculate local distance for each possible match 
     double dist = sqrt((from.x - to.x) * (from.x - to.x) + (from.y - to.y) * (from.y - to.y)); 

     //save as best match if local distance is in specified area and on same height 
     if (dist < tresholdDist && abs(from.y-to.y)<5) 
     { 
      good_matches2.push_back(matches[i][j]); 
      j = matches[i].size(); 
     } 
    } 
}*/ 

Mat allmatchs; 
    drawMatches(objectImg,objectKeypoints,sceneImg,sceneKeypoints,good_matches,allmatchs,Scalar::all(-1), Scalar::all(-1),vector<char>(),0); 
namedWindow("Matchs" , CV_WINDOW_NORMAL); 
imshow("Matchs",allmatchs); 

waitKey(0); 

} 

[Неправильный Match При обрезанных из другого источника] [1]

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

Я использую opencv3.0

Пожалуйста, помогите, есть ли я вносить изменения в коде или я должен использовать шаблон соответствия или какой-либо другой technique.I не могут использовать детекторы SUR, так как я не могу быть платные версии из-за лицензионных conflits ??

Примеры изображений:

Source Image

Template

+0

, как вы можете видеть на изображении, источника и цели дона» t сохраняют одни и те же ключевые точки. Вам нужно будет найти детектор функций, который будет более надежным для ваших типов изображений. Кроме того, возможно, это не так умно, но все значки шаблонов в одном большом изображении, потому что если ключевые точки обнаружены в большом масштабе, дескриптор ключевой точки в одном значке может также содержать части соседних значков. Чтобы проанализировать, что вы должны нарисовать размер/масштаб ключевых точек, тоже. – Micka

+0

Если ваши ключевые точки вообще не обрабатывают масштаб (я не знаю MSER), дескрипторы, очевидно, не работают для разных размеров источника и цели. – Micka

+0

Вы можете подробно рассказать об этом и предоставить подробную информацию о том, где можно изменить изменения. @Micka – Alagiri

ответ

1

Глядя на изображение, вы при условии, что я могу предложить некоторые изменения, которые помогут вам.

  • Удалить выбранные совпадения, это создает проблемы при наличии острых признаков. Острые функции имеют очень меньшее расстояние для хэминга по сравнению с другими хорошими совпадениями. Когда вы выбираете 2 * min_dist, косвенно вы игнорируете возможные хорошие совпадения.
  • Удостоверьтесь, что в изображении объекта имеется разумное количество точек.
  • Если эта функция обнаружения и комбинации дескрипторов не работает, выберите другой детектор функций и дескрипторы, такие как STAR-BRIEF, SURF, которые намного лучше, чем MSER-ORB.
  • В вашей ситуации, детектор-сопряжение не обязательно должен быть инвариантом вращения, он должен быть инвариантным по масштабам. Так что попробуйте повторно проклеек изображения объекта

Надеется мои предложения помочь вам

+0

Вместо этого хороших совпадений, что лучше всего подходит для фильтрации хороших совпадений, и я не могу использовать SURF, можете ли вы предложить другую комбинацию и как я могу убедиться, что в изображении объекта есть достаточное количество точек, а STAR и BRIEF недоступны в opencv 3.0 – Alagiri

+0

@Alagiri другие детекторы имеют опции для выбора нет. функций, которые будут присутствовать в Image. Таким образом, установочный порог будет достаточным. – nbsrujan

+0

Можете ли вы изменить этот код и опубликовать его или отправить мне по электронной почте по адресу [email protected] Я должен представить код, пожалуйста, @nbsrujan – Alagiri

 Смежные вопросы

  • Нет связанных вопросов^_^