cvCreateImage與cvCreateImageHeader區別和使用
阿新 • • 發佈:2019-01-23
1. cvCreateImage使用方法
1.1功能:建立影象首地址,並分配儲存空間。
IplImage* cvCreateImage(CvSize cvSize(int width, int height), int depth, int channels);
引數說明:
1.CvSize cvSize(int width, int height):影象的寬度和高度
2.int depth:影象畫素的位深度
值為可以為下面幾種:
程式碼 | 含義 |
---|---|
IPL_DEPTH_8U | 8位無符號整數 |
IPL_DEPTH_8S | 8位符號整數 |
IPL_DEPTH_16U | 16位無符號整數 |
IPL_DEPTH_16S | 16位符號整數 |
IPL_DEPTH_32S | 32位符號整數 |
IPL_DEPTH_32F | 單精度浮點數 |
IPL_DEPTH_64F | 雙精度浮點數 |
3. int channels:每個畫素的通道數
可以為1,2,3或4
2.cvCreateImageHeader使用方法
2.1功能:建立影象首地址,並不會初始化空間內的資料
IplImage*cvCreateImageHeader( CvSize size, int depth, int channels );
引數說明:(同上)
3.檢視cvCreateImage與cvCreateImageHeader原始碼==》區別
CV_IMPL IplImage * cvCreateImage( CvSize size, int depth, int channels ) { IplImage *img = cvCreateImageHeader( size, depth, channels ); assert( img ); cvCreateData( img ); return img; } // create IplImage header CV_IMPL IplImage * cvCreateImageHeader( CvSize size, int depth, int channels ) { IplImage *img = 0; if( !CvIPL.createHeader ) { img = (IplImage *)cvAlloc( sizeof( *img )); cvInitImageHeader( img, size, depth, channels, IPL_ORIGIN_TL, CV_DEFAULT_IMAGE_ROW_ALIGN ); } else { const char *colorModel, *channelSeq; icvGetColorModel( channels, &colorModel, &channelSeq ); img = CvIPL.createHeader( channels, 0, depth, (char*)colorModel, (char*)channelSeq, IPL_DATA_ORDER_PIXEL, IPL_ORIGIN_TL, CV_DEFAULT_IMAGE_ROW_ALIGN, size.width, size.height, 0, 0, 0, 0 ); } return img; }
函式 cvCreateImage 建立頭並分配資料,這個函式是下列的縮寫型式
cvCreateImageHeader()與cvCreateData(),而cvCreateImageHeader()只是建立空間,並不會初始化空間內的資料。cvCreateImage 與cvCreateImageHeader均是IplImage* 型別的影象頭指標,這兩個函式的區別是cvCreateImage 除了分配影象頭之外,還分配影象資料,而cvCreateImageHeader僅僅是分配影象頭,並沒有分配影象資料。
4.函式呼叫案例
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include <iostream>
#define _CRT_SECURE_NO_WARNINGS
using namespace cv;
using namespace std;
static IplImage *img0 = NULL;
static IplImage *img1 = NULL;
static IplImage *img2 = NULL;
static IplImage *img3 = NULL;
int main(int argc, char** argv)
{
IplImage* gray;
uchar* dataGray;
int row;
int col;
int tempRow;
int tempCol;
int stepGray;
char filename[] = "148g.png";
gray = cvLoadImage(filename, CV_LOAD_IMAGE_UNCHANGED);
dataGray = (uchar*)gray->imageData;
stepGray = gray->widthStep / sizeof(uchar);
//test img0
//此方式可以在連續輸入影象時,每張影象大小不確定時,且想在初始化時建立影象頭
//先建立一個很小的影象空間頭
img0 = cvCreateImageHeader(cvSize(1, 1), 8, 1);
//初始化影象
cvInitImageHeader(img0,cvSize(gray->width,gray->height), 8, 1, 0, 4);
//連線資料
cvSetData(img0,gray->imageData, img0->widthStep);
//顯示
cvNamedWindow("img0");
cvShowImage("img0", img0);
cvWaitKey(20);
//釋放
cvReleaseImageHeader(&img0); //將它的影象頭釋放,沒有釋放資料空間!
img0 = NULL;
// test img1
img1 = cvCreateImageHeader(cvSize(gray->width, gray->height), IPL_DEPTH_8U, 1);
cvSetData(img1,gray->imageData,img1->widthStep);
cvNamedWindow("img1");
cvShowImage("img1", img1);
cvWaitKey(20);
cvReleaseImageHeader(&img1); //將它的影象頭釋放,沒有釋放資料空間!
img1 = NULL;
//test img2 //此方法是已經確定傳入影象的大小
img2 = cvCreateImage(cvSize(gray->width, gray->height), IPL_DEPTH_8U,1);
//賦值資料
memcpy(img2->imageData, gray->imageData, gray->widthStep*gray->height);
cvNamedWindow("img2");
cvShowImage("img2", img2);
cvWaitKey(20);
cvReleaseImage(&img2); //將它的頭和影象資料釋放!
img2 = NULL;
//test img3
//先建立一個很小的影象空間頭 因為不確定要傳入影象的大小
img3 = cvCreateImageHeader(cvSize(1, 1), 8, 1);
img3 = cvCreateImage(cvSize(gray->width, gray->height), IPL_DEPTH_8U, 1);
memcpy(img3->imageData, gray->imageData, gray->widthStep*gray->height);
cvNamedWindow("img3");
cvShowImage("img3", img3);
cvWaitKey(20);
cvReleaseImage(&img3); //將它的頭和影象資料釋放!
img3 = NULL;
cvNamedWindow("gray");
cvShowImage("gray", gray);
cvWaitKey(20);
return 0;
}
以上4中方法都可以建立影象空間。