Как я должен использовать cvReshape? - PullRequest
0 голосов
/ 19 августа 2011

Я пытаюсь использовать cvReshape, чтобы иметь 2 версии одинаковых данных матрицы. Например, здесь gray_img - это матрица 100x100, а gray_line - это матрица 10000x1, указывающая на те же данные, но с другим заголовком. Это то, что я делаю в OpenCV, следуя документации:

CvMat *  gray_img;
CvMat  gray_line_header;
CvMat * gray_line;
gray_img = cvCreateImage(100, 100, IPL_DEPTH_32F, 1);
gray_line = cvReshape(gray_img, &gray_line_header, 0, 10000);

Это работает как задумано, но я чувствую, что это трудно читать и вообще не изящно. Если я правильно понимаю, gray_line будет указывать на gray_line_header, поэтому я чувствую, что у меня есть дополнительная переменная здесь. Можно ли делать то, что я хочу, без объявления заголовка матрицы или только с 2 (вместо 3) объявлениями матриц?

спасибо

Ответы [ 2 ]

3 голосов
/ 20 августа 2011

Вы привержены старому интерфейсу C OpenCV?С помощью интерфейса C ++ вы можете сделать это:

cv::Mat grayImg(100, 100, CV_32FC1);
cv::Mat grayLine(grayImg);
grayLine.reshape(1,10000); //1 column, 10000 rows

Теперь у вас есть два экземпляра, которые указывают на одни и те же данные.

1 голос
/ 20 августа 2011

Ваше предположение верно.

gray_line точно указывает на дополнительную переменную gray_line_header.

Однако, похоже, простых решений вашей проблемы не существует ......

Если вы кодируете так:

CvMat *gray_img, *gray_line;
gray_img = cvCreateMat(20, 20, CV_8U);
gray_line = cvReshape(gray_img, gray_line, 0, 40);
cvShowImage("after reshape", gray_line);
cvWaitKey(0);

Это, безусловно, вызывает ошибку сегментации ...

Чтобы избавиться от дополнительной переменной, я могу предложить только 2 еще не изящных решения.

  1. использовать только один указатель, один фактический

    CvMat *gray_img, gray_line_data;
    gray_img = cvCreateImage(100, 100, IPL_DEPTH_32F, 1);
    cvReshape(gray_img, &gray_line_data, 0, 10000);
    CvMat *gray_line = &gray_line_data;
    
  2. использовать только два указателя и вызвать cvCreateMatHeader перед cvReshape

    CvMat *gray_img, *gray_line;
    gray_img  = cvCreateMat(20, 20, CV_8U);
    // initialize gray_img (omitted)
    gray_line = cvCreateMatHeader(40, 1, gray_img->type);
    gray_line = cvReshape(gray_img, gray_line, 0, 40); // maybe just data pointer reassigning?
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...