IT TIP

OpenCV : IplImage와 Mat, 어떤 것을 사용해야합니까?

itqueen 2020. 12. 15. 20:39
반응형

OpenCV : IplImage와 Mat, 어떤 것을 사용해야합니까?


저는 OpenCV를 처음 접했습니다 (현재 약 2 개월). Bradski와 Kaehler의 OpenCV 학습 책이 있습니다. 내 질문은 2.0+ 방식으로 모든 작업을 수행하려면 언제 매트릭스 (Mat)를 사용해야하며 언제 IplImage를 사용해야합니까?

Bradky의 책은 OpenCV 2.0을 기반으로 작성되었으며 대부분 샘플 코드에서 IplImage를 사용하고 있지만 최근 온라인 문서에서는 Mat가 이제 이미지, 마스크 등을위한 포괄적 인 데이터 유형 인 것처럼 들리게합니다. , 일종의 Matlab의 기본 행렬과 같습니다. 이로 인해 IplImage가 쓸모없는 것으로 간주되어야하는지 궁금합니다.

그렇다면 새 코드를 작성할 때 IplImages를 완전히 피해야합니까? 아니면 IplImages를 통해 Mats가 할 수없는 중요한 기능이 있습니까?

감사.


IplImage처음부터 OpenCV에있었습니다. OpenCV 용 C 인터페이스의 일부입니다. IplImage구조에 대한 메모리를 직접 할당하고 할당 해제해야합니다 . ( cvReleaseImage명령을 기억 하십니까?)

Mat구조는 C ++ 구조의 일부입니다. 그래서 분명히 객체 지향적입니다. 또한 모든 메모리를 관리합니다! 그것은 그것에 대한 참조를 추적합니다. 그런 다음 참조 수가 0이되고 자동으로 할당이 해제됩니다. 이것은 하나의 뛰어난 기능입니다!

대한 이동 Mat. Intellisense가있는 IDE를 사용하는 경우 코드를 IplImage사물 에서 사물로 쉽게 변환 할 수 있어야합니다 Mat(입력 할 때 가능한 함수, 변수 등의 목록이 드롭 다운됩니다).


나는 Mat. 나는 그것을 한동안 사용해 왔고 훌륭합니다. 멤버 함수와 행렬 식을 사용 IplImage하면 처리하는 것보다 훨씬 간단 하고 포괄적 인 데이터 유형이라고 말한 것입니다.

가자 Mat!


이것은 실제로 응용 프로그램을 실행할 플랫폼에 따라 다릅니다. 임베디드 시스템 용 응용 프로그램을 개발하는 경우 C를 사용할 가능성이 더 높습니다.이 경우 IplImage. 튜토리얼 에서 인용 :

C ++ 인터페이스의 주된 단점은 현재 많은 임베디드 개발 시스템이 C 만 지원한다는 것입니다. 따라서 임베디드 플랫폼을 대상으로하지 않는 한 이전 방법을 사용할 필요가 없습니다 (매조 히 스트 프로그래머가 아닌 경우 문제).


도와 주셔서 감사합니다.

또한이 질문을 게시 한 이후 Mat로 인수로 a 함수 IplImage가 해당 Mat인수 대신 직접 사용할 수 있다는 사실을 발견 했습니다. 이로 인해 코드가 이미 편리한 함수로 분할 된 경우 코드를 덩어리로 업데이트하는 것이 매우 쉽습니다. 함수 인수를에서 IplImage*변경 Mat한 다음 Mat. 해당 함수를 호출하는 다른 코드는 여전히 잘 작동합니다 (내 경험에 있음).


빠른 업데이트:

OpenCV 4 의 도래로 IplImage와 그들이 지금 "레거시 C API"라고 부르는 모든 것이 점진적으로 제거됨에 따라 질문에 대한 답이 더 간단해질 것입니다. OpenCV 4.0 "alpha"에서 IplImage는 이미 사라졌습니다-CvMat .

따라서 OpenCV4.0 +로 작업 하는 경우 Mat Class ...를 사용하십시오 . 선택의 여지가 없기 때문입니다.

[주의 : 물론 OpenCV의 이전 버전을 사용하고 있다면 질문은 여전히 ​​관련이 있습니다.]


나는 Mat를 추천합니다. 가비지 수집은 자동이므로 응용 프로그램의 안정성이 높고 메모리 누수가 적습니다. 또한 Mat는 새로운 데이터 저장 방법이므로 OpenCV로 시작하는 초보자라면 Mat가 더 새롭고 완전한 응용 프로그램을 만들기 위해 덜 신중한 코딩이 필요합니다.

호환성은 Mat가 조금 더 나빠질 것입니다. IplImage는 더 오래 사용 가능하므로 대부분의 것들과 더 큰 호환성을 가지고 있습니다. IplImage도 Mat와 함께 사용할 수 있다고 생각하며 그렇지 않은 경우 IplImage> Mat도 수행하기가 매우 간단합니다.

Iplimage는 훨씬 더 오랜 기간 동안 사용 가능했기 때문에 더 많은 샘플을 찾을 수있을 것입니다.

여기 내 두 센트가 있습니다. OpenCV를 사용한 비전 프로세싱의 신인 (아직 배우는 트릭)으로서 Mat 또는 IplImage 중 하나를 선택하고 정말 잘해보세요. 그러나 다른 것과 호환되지 않는 기능을 사용해야하는 경우 수행 할 작업을 알 수 있도록 최소한 다른 것의 기본 사항을 배우십시오.

그러나 반복해서, 당신이 초보자라면 Mat로 시작하십시오. 새로운 구현이기 때문에 배우고 올바르게 얻는 것이 더 쉽습니다!


매트는 훨씬 쉽고 사용하기 쉽습니다. 이미지를 행렬로 나타냅니다. 너무 빠릅니다. IplImage보다 Mat를 추천합니다.


Iplimage는 Opencv에서 C 인터페이스의 일부 구조이며 Mat는 C ++ 프로그램에 더 적합하며 ref 매개 변수 및 스트림 연산자 등과 같은 일부 C ++ 스타일을 지원합니다. 모두 객체 지향 프로그래밍이지만 Mat는 Iplimage보다 더 많은 메서드를 포함합니다. Ipliamge는 완료하기 위해 일부 cvXXX 인터페이스를 호출합니다. 또한 Mat는 Opencv2의 새로운 구조로 이전 버전에 대한 개발의 상징이라고 생각합니다. 도움이 되었으면합니다.


cv :: Mat을 사용하는 것이 훨씬 더 편리하다고 생각합니다. 더 일반적입니다. IplImage가 cv :: Mat의 하위 집합임을 볼 수 있습니다. IplImage의 기본 데이터 유형은 부호없는 정수이고 cv :: Mat의 데이터 유형은 double입니다. 따라서 모든 종류의 수학 연산에 Mat를 사용하는 것이 훨씬 더 쉽습니다.


저는 2012 년쯤에 opencv를 사용하기 시작했습니다. 그래서 저는 강력하고 사용하기 쉬운 Mat로 시작했습니다. 그러나 "오래된"코드를 읽거나 재사용하려면 iplimages에 대해 알고 있어야했습니다. 사용, 또한. 하지만 미래는 매트라고 생각합니다. 그리고 클래스에서 매트를 잊지 마세요. 즉, 매트를 해제 할 필요가 없습니다. 반면에, 당신은 implimage를 해제해야합니다. 제 영어 실력이 좋지 않아요.


Blob 감지 루틴을 작성할 때

IplImage* img;
uchar* image_src = (uchar*)img->imageData;
image_src[x+y*width] = ...;

사용하는 것보다 훨씬 빠릅니다

Mat image;
image.at<uchar>(x,y) = ...;

About 5x faster. Some of this may be because I used a nested X,Y loop for Mat and a single loop for IplImage. But if you have to write any routines that work directly off pixels I would stick with IplImage.

ReferenceURL : https://stackoverflow.com/questions/3232022/opencv-iplimage-versus-mat-which-to-use

반응형