Преобразования с Эмгу (OpenCV) - аффинно / перспектива? - PullRequest
1 голос
/ 06 февраля 2011

В настоящее время я пытаюсь реализовать преобразования с помощью EMGU, хотя я не могу понять, как это работает (и, похоже, в Интернете нет примеров).

У меня есть изображение с 4 точками, из которых я хочу преобразовать (и в), хотя я не знаю, какие другие переменные требуются, оно запрашивает mapMat?

Вот что у меня есть:

        float[,] tmp = {
                            {bottomLeft.x, bottomLeft.y},
                            {topLeft.x, topLeft.y},
                            {topRight.x, topRight.y},
                            {bottomRight.x, bottomRight.y}
                       };
        Matrix<float> sourceMat = new Matrix<float>(tmp);
        float[,] target = {
                            {0, height},
                            {0, 0},
                            {width, 0},
                            {width, height}
                       };
        Matrix<float> targetMat = new Matrix<float>(target);
        //mapMat = just a placeholder matrix?
        Matrix<float> mapMat = new Matrix<float>(target);
        CvInvoke.cvGetAffineTransform(sourceMat.Ptr, targetMat.Ptr, mapMat.Ptr);

Это, однако, не работает. Я также был не уверен, было ли аффинное преобразование самым идеальным решением? Я читал кое-что и о FindHomography, а также о перспективных преобразованиях, но не уверен, применимы ли они здесь.

Цель трансформации, которую я хочу достичь, выглядит следующим образом:

http://img832.imageshack.us/img832/5157/targettransform.png

Любая помощь будет принята с благодарностью,

Спасибо

1 Ответ

3 голосов
/ 07 февраля 2011

Первое небольшое вступление:

  • Если вы хотите аффинное преобразование (как видно из вашей картинки), вам нужно как минимум 3 пары точек, потому что у вас есть 6 параметров для оценки
  • Если вы хотите более общее преобразование, т.е. гомографию, вам нужно как минимум 4 пары точек, потому что у вас есть 8 параметров для оценки

Итак, предположим, у вас есть 4 исходных и конечных угла, и вы хотитеоцените перспективное преобразование, этот код должен делать то, что вы хотите:

PointF[] pts1 = new PointF[4];
PointF[] pts2 = new PointF[4];
HomographyMatrix homography;
for (int i = 0; i < 4; i++)
{
  pts1[i] = new PointF (sourceCorner[i].X, sourceCorner[i].Y);
  pts2[i] = new PointF (destCorner[i].X, destCorner[i].Y);
}
homography = CameraCalibration.GetPerspectiveTransform(pts1, pts2);

Посмотрите на CameraCalibration для других полезных методов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...