Я пытаюсь совместить два изображения с одним снимком экрана мобильного экрана, а изображение шаблона - любое приложение. Если я сопоставляю исходный код и шаблон, обрезанный с одних и тех же изображений, он идеально подходит. Но когда я использую значок приложения, обрезанный с другого мобильного экрана он не соответствует должным образом.Функция соответствия 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 ??
Примеры изображений:
, как вы можете видеть на изображении, источника и цели дона» t сохраняют одни и те же ключевые точки. Вам нужно будет найти детектор функций, который будет более надежным для ваших типов изображений. Кроме того, возможно, это не так умно, но все значки шаблонов в одном большом изображении, потому что если ключевые точки обнаружены в большом масштабе, дескриптор ключевой точки в одном значке может также содержать части соседних значков. Чтобы проанализировать, что вы должны нарисовать размер/масштаб ключевых точек, тоже. – Micka
Если ваши ключевые точки вообще не обрабатывают масштаб (я не знаю MSER), дескрипторы, очевидно, не работают для разных размеров источника и цели. – Micka
Вы можете подробно рассказать об этом и предоставить подробную информацию о том, где можно изменить изменения. @Micka – Alagiri