Вопрос по opencvdotnet, opencv – CvMat и Imread против IpImage и CvLoadImage

8

Using OpenCv 2.4

У меня есть два варианта загрузки изображений:

  1- CvMat and Imread

  2- IpImage and CvLoadImage    

Какой из них лучше использовать? Я попытался смешать два и в конечном итоге ошибка сегмента.

Ваш Ответ

4   ответа
0

Я бы посоветовал вам использовать Mat и imread (), поскольку получить данные из Mat очень просто.

Mat :: data возвращает указатель на фактические данные матрицы, которые в 1D и значения легко доступны.http://opencv.itseez.com/modules/core/doc/old_basic_structures.html?highlight=mat#union%20data

Если вы хотите добавить концепции машинного обучения в OpenCV для различных алгоритмов отслеживания (например, OpenTLD), вы можете легко получить доступ к данным, используя Mat.data, чтобы получить указатель на фактическую матрицу.

Многие из утилит OpenCV (например, CalcOpticalFlowPyrLK и т. Д.) Требуют Mat. Я бы предложил вам использовать мат. IplImage это старая вещь сейчас.

14

imread возвращаетMatнеCvMat, Это два разных интерфейса (Mat/imread для C ++ и Ipl ... и Cv .. для интерфейса C).

Интерфейс C ++ более приятный, безопасный и простой в использовании. Он автоматически обрабатывает память и позволяет писать меньше кода для той же задачи. Ребята из OpenCV выступают за использование C ++, если только некоторые очень специфические требования проекта не заставят вас перейти к C.

Пример (C ++)

cv::Mat image = imread("path/to/myimage.jpg")
if(image.empty())
    return;

cv::imshow("Image", image);

cv::Mat bw = image > 128; // threshold image
cv::Mat crop = image(cv::Rect(0, 0, 100, 100)); // a 100px x 100px crop
crop= 0; // set image to 0

cv::waitKey();
// end code here

Обратите внимание, что если не указано иное, все матричные присвоения ссылаются на одни и те же данные. В приведенном выше примереcrop матрица указывает наimageи установка его в ноль установит эту конкретную частьimage до 0.

Чтобы создать новую копию данных, используйте Mat :: copyTo или Mat :: clone ();

И интерфейс C

IplImage* pImg = CvLoadImage("path/to/myimage.jpg");
if(pImg == NULL)
    return;

// ... big bloat to do the same operations with IplImage    

CvShowImage("Image", pImg);
cvWaitKey();
CvReleaseImage(&pImg); // Do not forget to release memory.
// end code here
0

Эта структура была унаследована от библиотеки IPL (то есть библиотека обработки изображений Intel), теперь интегрированная с библиотекой IPP (Intel Интегрированная библиотека примитивов производительности). Если вы используете код и библиотеки, которые были созданы с старый интерфейс C, возможно, вам придется манипулировать этими структурами IplImage. К счастью, Есть удобный способ конвертировать IplImage в объект cv :: Mat.

IplImage * iplImage = cvLoadImage (& quot; c: \ img.jpg & quot;); cv :: Mat image4 (iplImage, false);

Функция cvLoadImage является функцией C-интерфейса для загрузки изображений. Второй параметр в конструкторе объекта cv :: Mat указывает, что данные не будут скопированы (установите для него значение true, если вы хотите новую копию, в то время как false - значение по умолчанию, поэтому его можно было опустить), то есть и IplImage, и image4 будут использовать одни и те же данные изображения. Вы должны быть осторожны здесь, чтобы не создавать висячие указатели. По этой причине безопаснее инкапсулировать IplImage указатель на класс указателя подсчета ссылок, предоставляемый OpenCV 2:

cv :: Ptr iplImage = cvLoadImage (& quot; c: \ img.jpg & quot;);

В противном случае, если вам нужно освободить память, указанную вашей структурой IplImage, вы нужно сделать это явно: cvReleaseImage (& амп; IplImage); Помните, что вам следует избегать использования этой устаревшей структуры данных. Вместо этого всегда используйте резюме :: Mat.

0

насколько вы удобны с указателями. В IplImage вы можете получить доступ к данным как

 data[i*widthstep+j*nchannels +k]

где i, j, k - некоторые целые числа, к которым довольно легко подойти. В обычной матрице 3 измерений это не так легко получить доступ к данным. Для нормальной матрицы доступ к данным для [i] [j]

  *(*(a + i) + j) is the value of jth element of ith row in matrix a

Похожие вопросы