openCv 학습 노트 (3) - openCv 데이터 구조 간 의 전환

7816 단어
1. IplImage * 에서 BYTE * 이미지 데 이 터 를 얻 습 니 다.
data = iplImage->imageDataOrigin; //정렬 되 지 않 은 원본 이미지 데이터
혹은
data = iplImage->imageData; //정렬 된 이미지 데이터
2. BYTE * 에서 IplImage * 이미지 데 이 터 를 얻 습 니 다.
iplImage = cvCreateImageHeader(cvSize(width,height),depth,channels);
cvSetData(iplImage,data,step);
먼저 cvCreate ImageHeader () 에서 IplImage 이미지 헤드 를 만 들 고 이미지 의 크기, 깊이, 채널 수 를 만 듭 니 다.그리고
cvsetData () 는 BYTE * 이미지 데이터 포인터 에 따라 IplImage 이미지 헤드 의 데이터 데 이 터 를 설정 합 니 다. 그 중에서 step 는 이 IplImage 이미 지 를 지정 합 니 다.
줄 당 차지 하 는 바이트 수, 1 채널 에 대한 IPLDEPTH_8U 그림, step 는 width 와 같 을 수 있 습 니 다.
1. 새로운 Iplimage 를 만 들 려 면 IplImage * cvCreateImage (CVsize size, int depth, int) 를 사용 하 십시오.
channels), 헤 더 를 만 들 고 데 이 터 를 분배 합 니 다.
주: 이 새 그림 을 사용 하지 않 을 때 void cvReleaseImage (IplImage * * image) 를 사용 하여 머리 와 그림 수 를 호출 합 니 다.
석방 에 의 하면!
2. 이미지 데이터 가 이미지 헤드 에 저장 공간 을 할당 하지 않 았 다 면 (즉, IplImage * 포인터 에 동적 저장 공간 을 할당 하지 않 았 다)
먼저 IplImage * cvCreateImageHeader (CVsize size, int depth, int channels) 를 호출 하여 이미지 헤드 를 만 든 다음
void cvsetData (CvArr * arr, void * data, int step) 에서 지정 한 이미지 데 이 터 를 호출 하면 새 그림 으로 이해 할 수 있 습 니 다.
같은 데이터 포인터 가 존재 하 는 이미지 데 이 터 를 가리 키 며 이미지 데이터 저장 공간의 배분 작업 이 존재 하지 않 습 니 다.
주: 이 새 그림 을 사용 하지 않 을 때 void cvReleaseImageHeader (IplImage * * image) 를 사용 하여 그림 을
머리 풀 어!
3. 이미지 데이터 에 도 이미지 헤드 가 있 으 면 (IplImage 가 정적 으로 저장 공간 을 분배 하 는 경우 에 사용) 먼저 IplImage * 를 호출 합 니 다.
cvInitImageHeader (CVsize, int depth, int channels) 이미지 헤드 를 변경 하고 void 를 호출 합 니 다.
cvsetData (CvArr * arr, void * data, int step) 에서 이미지 데 이 터 를 지정 합 니 다.
주: 이 새 그림 은 다른 그림 의 데이터 와 기 존 그림 헤드 를 사용 하기 때문에 cvReleaseImage 를 사용 할 수 없습니다.
머리 와 이미지 데 이 터 를 방출 할 수도 없고 cvReleaseData 를 사용 하여 이미지 데 이 터 를 방출 할 수도 없습니다!
4, 이미 있 는 그림 에서 만 들 면, IplImage * cvCloneImage (const IplImage * image) 로 만 듭 니 다.
그림 의 전체 복사 본 은 머리, ROI, 데 이 터 를 포함한다.
주: 이 새 그림 을 사용 하지 않 을 때 void cvReleaseImage (IplImage * * image) 를 사용 하여 머리 와 그림 수 를 호출 합 니 다.
석방 에 의 하면
이상 발췌:http://blog.csdn.net/xiaofengsheng/archive/2009/11/16/4814709.aspx
 다음은 CvArr, Mat, CvMat, IplImage, BYTE 전환 의 총 결http://blog.csdn.net/wuxiaoyao12/article/details/7305848
1. Mat 유형: 행렬 유형, Matrix.
    openCV 에서 Mat 는 다 차원 밀집 데이터 배열 이다.벡터 와 행렬, 이미지, 직사 도 등 흔히 볼 수 있 는 다 차원 데 이 터 를 처리 할 수 있다.
    Mat 는 세 가지 중요 한 방법 이 있 습 니 다.
         1、Mat mat = imread(const String* filename);            그림 읽 기
         2、imshow(const string frameName, InputArray mat);      그림 보이 기
         3、imwrite (const string& filename, InputArray img);    이미지 저장
    Mat 유형 은 CvMat 와 IplImage 유형 에 비해 더욱 강 한 행렬 연산 능력 을 가지 고 흔히 볼 수 있 는 행렬 연산 을 지원 합 니 다.밀집 형 을 계산 하 는 응용 에서 CvMat 와 IplImage 유형 을 Mat 유형 으로 바 꾸 면 계산 시간 이 크게 줄어든다.
A.Mat -> IplImage
데 이 터 를 복사 하지 않 고 그림 헤더 만 만 들 었 습 니 다.
예: / / Mat 형식의 imgMat 이미지 데이터 가 존재 한다 고 가정 합 니 다.
IplImage pImg= IplImage(imgMat);
B.Mat -> CvMat
IplImage 변환 과 유사 합 니 다. 데 이 터 를 복사 하지 않 고 행렬 헤드 만 만 만 듭 니 다.
예: / / Mat 형식의 imgMat 이미지 데이터 가 존재 한다 고 가정 합 니 다.
     CvMat cvMat = imgMat;
2. CvMat 형식 과 IplImage 형식: "이미지" 형식
       openCV 에서 Mat 유형 과 CvMat, IplImage 유형 은 모두 이미 지 를 대표 하고 표시 할 수 있 지만 Mat 유형 은 계산 에 중심 을 두 고 수학 성 이 높 으 며 openCV 는 Mat 유형 에 대한 계산 도 최적화 했다.한편, CvMat 와 IplImage 유형 은 '이미지' 에 중심 을 두 고 openCV 는 그 중의 이미지 조작 (크기 조정, 단일 채널 추출, 이미지 한도 값 조작 등) 을 최적화 시 켰 다.
보충: IplImage 는 CvMat 에서 파생 되 고 CvMat 는 CvArr 에서 파생 됩 니 다. 즉, CvArr - > CvMat - > IplImage 입 니 다.
            CvArr 는 함수 의 매개 변수 로 사용 되 며, CvMat 나 IplImage 가 들 어 오 든 내 부 는 CvMat 로 처 리 됩 니 다.
1.CvMat
A.CvMat-> IplImage
IplImage* img = cvCreateImage(cvGetSize(mat),8,1); cvGetImage(matI,img);
cvSaveImage("rice1.bmp",img);
B.CvMat->Mat
IplImage 변환 과 유사 하여 데 이 터 를 복사 할 지 여 부 를 선택 할 수 있 습 니 다.
Mat::Mat(const CvMat* m, bool copyData=false);
openCV 에 서 는 벡터 (vector) 의 데이터 구조 가 없습니다.언제든지, 그러나 우리 가 벡터 를 표시 하려 고 할 때, 행렬 데이터 로 표시 하면 된다.
그러나 CvMat 유형 은 우리 가 선형 대수 과정 에서 배 운 벡터 개념 에 비해 더욱 추상 적 이다. 예 를 들 어 CvMat 의 요소 데이터 유형 은 기본 데이터 유형 에 만 국한 되 지 않 는 다. 예 를 들 어 다음 에 2 차원 데이터 행렬 을 만 들 겠 다.
              CvMat* cvCreatMat(int rows ,int cols , int type);
이 type 은 RGB 나 다른 다 중 채널 데이터 와 같은 임의의 미리 정 의 된 데이터 형식 일 수 있 습 니 다.이렇게 하면 우 리 는 CvMat 매트릭스 에서 풍부 하고 다채로운 이미 지 를 표시 할 수 있다.
2.IplImage
형식 관계 에 있어 서, 우 리 는 IplImage 형식 이 CvMat 형식 에서 계승 되 었 다 고 말 할 수 있 습 니 다. 물론 다른 변 수 는 이 를 이미지 데이터 로 해석 하 는 것 도 포함 되 어 있 습 니 다.
IplImage 형식 은 CvMat 에 비해 depth 와 nChannel 등 많은 인자 가 많 습 니 다.일반적인 매트릭스 유형 에 서 는 일반적으로 깊이 와 채널 수 를 동시에 나타 낸다. 예 를 들 어 32 비트 로 RGB + Alpha 를 표시 한다. 그러나 이미지 처리 에서 우 리 는 깊이 와 채널 수 를 분리 하여 처리 하 는데 이렇게 하 는 것 은 OpenCV 가 이미지 에 대한 최적화 방안 이다.
IplImage 의 이미지 에 대한 또 다른 최 적 화 는 변수 origin - 원점 입 니 다.컴퓨터 시각 처리 에 있어 중요 한 불편 은 원점 에 대한 정의 가 명확 하지 않 고 이미지 출처, 인 코딩 형식, 심지어 운영 체제 가 제자리 선택 에 영향 을 줄 수 있다 는 것 이다.이 를 보완 하기 위해 openCV 는 사용자 가 자신의 원점 설정 을 정의 할 수 있 도록 합 니 다.수치 0 은 원점 이 그림 왼쪽 상단 에 있 음 을 나타 내 고 1 은 왼쪽 하단 을 나타 낸다.
dataOrder 매개 변 수 는 데이터 의 형식 을 정의 합 니 다.IPL 있 음DATA_ORDER_PIXEL 과 IPLDATA_ORDER_PLANE 두 가지 수치, 전 자 는 픽 셀, 서로 다른 채널 의 데이터 가 교차 배열 되 고 후 자 는 모든 채널 이 순서대로 평행 으로 배열 되 는 것 을 나타 낸다.
IplImage 형식의 모든 추가 변 수 는 '이미지' 의 표시 와 계산 능력 에 대한 최적화 입 니 다.
A.IplImage -> Mat
IplImage* pImg = cvLoadImage("lena.jpg"); Mat img(pImg,0); // 0 은 영상 을 복사 하지 않 습 니 다. 즉, pImg 과 img 의 data 는 같은 메모리 위 치 를 공유 합 니 다. header 는 각각 B. IplImage - > CvMat 가 있 습 니 다.
법 1: CvMat mathdr, * mat = cvGetMat (img, & mathdr);
법 2: CvMat * mat = cvCreateMat (img - > height, img - > width, CV 64FC3);  cvConvert( img, mat );
C.IplImage*-> BYTE*
BYTE* data= img->imageData;
CvMat 와 IplImage 를 만 들 때의 작은 차이 점:
1. 행렬 을 만 들 때 첫 번 째 매개 변 수 는 줄 수 이 고 두 번 째 매개 변 수 는 열 수 입 니 다.
CvMat* cvCreateMat( int rows, int cols, int type );
2. 그림 을 만 들 때 CVsize 의 첫 번 째 매개 변 수 는 너비, 즉 열 수 입 니 다.두 번 째 매개 변 수 는 높이, 즉 줄 수 입 니 다.이것 은 CvMat 매트릭스 와 정반 대 이다.
IplImage* cvCreateImage(CvSize size, int depth, int channels );
CvSize cvSize( int width, int height );
IplImage 내부 buffer 줄 마다 4 바이트 로 정렬 되 어 있 습 니 다. CvMat 에는 이 제한 이 없습니다.
보충:
A.BYTE*-> IplImage*
img= cvCreateImageHeader(cvSize(width,height),depth,channels);
cvSetData(img,data,step);
/ / 먼저 cvCreate ImageHeader () 에서 IplImage 이미지 헤드 를 만 들 고 이미지 의 크기, 깊이, 채널 수 를 만 듭 니 다.
/ / 그리고 cvsetData () 에서 BYTE * 이미지 데이터 포인터 에 따라 IplImage 이미지 헤더 의 데이터 데 이 터 를 설정 합 니 다.
/ / 그 중에서 step 는 이 IplImage 이미지 의 줄 당 차지 하 는 바이트 수 를 지정 합 니 다. 1 채널 의 IPLDEPTH_8U 그림, step 는 width 와 같 을 수 있 습 니 다.
직접 써 보 려 고 했 는데 이상 블 로 거들 이 잘 했 어 요. 짱 이에 요........................................................
다음은 자신의 간단 한 테스트 프로그램 입 니 다.
 
#include<cv.h>
#include<highgui.h>
#include<iostream>
using namespace cv;
using namespace std;
int main()
{

	IplImage* iplImage;
	iplImage=cvLoadImage("D:\\openCV\\openCVProject\\openCv  \\openCv  \\test.jpg");
	cvNamedWindow("IplImage");
    namedWindow("CvMat1");
	namedWindow("CvMat2");
	//cvNamedWindow("Mat");
	//
	Mat imgMat(iplImage);
	Mat imgMat_1=iplImage;//     
    CvMat cvmat=imgMat;
	//cvReleaseImage(&iplImage);
	//cvShowImage("IplImage",iplImage);
	//cvWaitKey(0);
	//imshow("IplImage",*iplImage);

	imshow("CvMat1",imgMat);
	imshow("CvMat2",imgMat_1);
    //cvShowImage("Mat",&cvmat);

    cvReleaseImage(&iplImage);
	cvDestroyWindow("IplImage");
	//cvDestroyWindow("CvMat");
	//cvDestroyWindow("Mat");
	cvWaitKey(0);
	return 0;
}

이상 은 imshow 와 cvshow Image 를 동시에 사용 할 수 없 는 것 같 습 니 다. 무슨 이유 인지 대 협 이 해결 하 기 를 기대 합 니 다...
 
 

좋은 웹페이지 즐겨찾기