Справка OpenCV по cvPerspectiveTransform - PullRequest
0 голосов
/ 14 сентября 2011

У меня проблема со следующим кодом, я пытаюсь изменить перспективу изображения с помощью cvPerspectiveTransform, но получаю следующую ошибку:

OpenCV Error: Assertion failed (scn + 1 == m.cols && (depth == CV_32F || depth == CV_64F)) 


  CvMat* p = cvCreateMat(2, 4, CV_64FC1);
  CvMat* h = cvCreateMat(2, 4, CV_64FC1);
  CvMat* p2h = cvCreateMat(2, 4, CV_64FC1);

  cvZero(p);
  cvZero(h);
  cvZero(p2h);
  //set src points
  for (int i = 0; i < 4; i++) {
    CvPoint point = verifiedPoints[i];
    cvmSet( p, 0, i, point.x );
    cvmSet( p, 1, i, point.y );
    printf("point %d (%d , %d)\n",i,point.x,point.y);
  }
  //set dst points
  cvmSet( h, 0, 0, 0 );
  cvmSet( h, 1, 0, real_height );

  cvmSet( h, 0, 1, real_width );
  cvmSet( h, 1, 1, real_height );

  cvmSet( h, 0, 2, real_width );
  cvmSet( h, 1, 2, 0 );

  cvmSet( h, 0, 3, 0 );
  cvmSet( h, 1, 3, 0);

  //cvPerspectiveTransform or cvFindHomography?
  cvPerspectiveTransform(p,h,p2h);

  cvReleaseMat(&p);
  cvReleaseMat(&h);

Я пытаюсь изменить p2h на другие значения, например:

 CvMat* p2h = cvCreateMat(3, 3, CV_32F)

но я получаю другую ошибку:

OpenCV Error: Assertion failed (dst.type() == src.type() && dst.channels() == m.rows-1) in cvPerspectiveTransform

Любая помощь?

1 Ответ

1 голос
/ 14 сентября 2011

Согласно документации OpenCV для cvPerspectiveTransform :

src - исходный двухканальный или трехканальный массив с плавающей запятой.Каждый элемент представляет собой двухмерный / трехмерный вектор для преобразования.dst - Массив назначения того же размера и типа, что и src.mtx - матрица преобразования с плавающей точкой 3x3 или 4x4.

Итак, вам нужно объявить свои матрицы следующим образом:

CvMat* p = cvCreateMat(1, 4, CV_64FC2);
CvMat* h = cvCreateMat(1, 4, CV_64FC2);
CvMat* p2h = cvCreateMat(3, 3, CV_64FC1); 
...