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

DennerV

Пользователи
  • Количество публикаций

    10
  • Зарегистрирован

  • Посещение

Все публикации пользователя DennerV

  1. Получить общие точки SURF

    Добрый день! Стоит задача в сравнении изображения с камеры с эталонным изображением. На данный момент реализован поиск объекта и поворот изображения. Сравнение пытался сделать через AbsDiff, проблема в том, что из-за качества картинки изображения получаются не пиксель в пиксель, а с небольшим смещением и/или поворотом в 1-2 градуса. Придумал что можно использовать SURF. Найти общие ключевые точки и при из помощи более точно позиционировать (если нудно масштабировать) изображения. Нашел пример использования SURF. Подскажите как получить отдельно общие точки? Может есть более лучший способ сравнения 2 изображений, чтоб получить их отличия? Пример изобрадения
  2. Получить общие точки SURF

    С гомографиейй так до конца и не разобрался Прочел здесь http://stackoverflow.com/questions/28725273/opencv-drawmatches-error, что matches содержит сопоставление между точками matches[0].TrainIdx и matches[0].QueryIdx, так ли это? Правильно ли я понял? Посчитал длины отрезков соседних точек - вроде как сходится, по координатам тоже похоже. Подскажите, как используя имеющеюся координаты повернуть второе изображение так, чтоб точки встали по координатам точек первого изображения?
  3. Получить общие точки SURF

    В моем случае отрицательных координат быть не должно, во всяком случае больших маленьких чисел, потому-что картинки почти одинаковые. findHomography возвращает Мат типа double, это не я придумал На выходных подумаю/почитаю, может что в голову да и придет Спасибо
  4. Получить общие точки SURF

    под z я имел ввиду 1 когда умножаю координаты на матрице то получаю отрицательные координаты, а такого уже быть не может Может неправильно что-то перевожу или порядок спутал Умножение: return new[] {a[0]*b[0, 0] + a[1]*b[1, 0] + a[2]*b[2, 0], a[0]*b[0, 1] + a[1]*b[1, 1] + a[2]*b[2, 1], a[0]*b[0, 2] + a[1]*b[1, 2] + a[2]*b[2, 2]} Получение b, написал выше, тип должен быть дубл?
  5. Получить общие точки SURF

    var srcPoints = modelKeyPoints.ToArray().Select(x => x.Point).ToList().GetRange(0, Math.Min(modelKeyPoints.Size, observedKeyPoints.Size)).ToArray(); var destPoints = observedKeyPoints.ToArray().Select(x => x.Point).ToList().GetRange(0, Math.Min(modelKeyPoints.Size, observedKeyPoints.Size)).ToArray(); Mat hom = new Mat(); CvInvoke.FindHomography(srcPoints, destPoints, hom, HomographyMethod.Ransac, 5); var arr = hom.GetData(); var b = new double[,] { {BitConverter.ToDouble(arr, 0), BitConverter.ToDouble(arr, 8), BitConverter.ToDouble(arr, 16)}, {BitConverter.ToDouble(arr, 24), BitConverter.ToDouble(arr, 32), BitConverter.ToDouble(arr, 40)}, {BitConverter.ToDouble(arr, 48), BitConverter.ToDouble(arr, 56), BitConverter.ToDouble(arr, 64)} }; for (var i = 0; i < matches.Size; i++) { var match = matches[i].ToArray(); if (mask.GetData(i)[0] == 0) continue; foreach (var e in match) { var a = new double[] {modelKeyPoints[e.QueryIdx].Point.X, modelKeyPoints[e.QueryIdx].Point.Y, 1.0}; var c = multiplication(a, b); MessageBox.Show(string.Format("Point: {0}", c)); } } массив b после перевода из байт в дубл содержит отрицательные числа, что мне кажется неправильным. Или я не так перевел? Какой порядок координат должен быть? (x, y, z)?
  6. Получить общие точки SURF

    После findHomography получил Mat 3x3? немного не понятно как координату умножить на матрицу, т.е. М1(1, 2) * М2(3, 3). Размеры же не совпадают, или нужно еще какие-то преобразования произвести? Я тут подумал, может не обязательно сопоставлять все точки, а можно найти матрицу гомографии и по ней сразу трансформировать все изображение?
  7. Получить общие точки SURF

    Как это можно сделать (сопоставление) самому? Допустим есть modelDescriptors - 50 точек и observedDescriptors 100 - точек, общие - пусть будет 20 точек. Каким образом пробежаться по modelDescriptors и найти/не найти точкам пару в observedDescriptors . Например: modelDescriptors [0] - пара не найдена modelDescriptors [1], координаты (25, 37) - пара observedDescriptors[8], координаты (183, 347) modelDescriptors [2], координаты (75, 81) - пара observedDescriptors[14], координаты (7, 34) modelDescriptors [3] - пара не найдена что-то в этом духе Как связаны modelKeyPoints и modelDescriptors? Порядковыми номерами или есть какие-то внутренние идентификаторы?
  8. Получить общие точки SURF

    Подскажите как происходит сопоставление найденных точек? В примере drawMatches и все. Мне же нужно взять несколько общих точек на обоих изображениях, знать их координаты, чтоб можно было оценить положение, разнице в размере. Откуда берется дистанция между точками?
  9. Получить общие точки SURF

    Скажем так, у меня скорее лабораторный образец, а не промышленная установка, поэтому с освещением худо-бедно можно решить. Как вариант расстраиваю бестеневую лампу/линзу с кольцевой подсветкой, линзу выкинуть, на ее место поставить камеру. Пока не опробовал, использую окно и белые листы бумаги) Насчет смещений я тоже думал об этом, самый простой вариант найти разность изображений (AbsDiff) а после найти контуры. Слишком маленькие контуры отсеивать, мелкие (небольшие смещения) уйдут, крупные (элементы/пустые места), останутся, тут уж придется действовать методом тыка. На данный момент проблема с точным позиционированием полученного изображения относительно контрольного
  10. Получить общие точки SURF

    Спасибо, буду разбирать пример Не подойдет, я потому-что заранее не известно что искать, Т.е. задача заключается в сравнении 2-х плат в показать расхождения (отсутствующий или лишний элемент), например показать синий кусок пластика на фото
×