cvCreateImageとcvCreateImageHeaderの区別と使用
4422 ワード
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ソースの表示===
関数cvCreateImageはヘッダを作成してデータを割り当てます.この関数は、以下の略語cvCreateImageHeader()とcvCreateData()ですが、cvCreateImageHeader()はスペースを作成するだけで、スペース内のデータは初期化されません.cvCreateImageとcvCreateImageHeaderはいずれもIplImage*タイプの画像ヘッダポインタであり、この2つの関数の違いはcvCreateImageが画像ヘッダの割り当てに加えて画像データを割り当てていることであり、cvCreateImageHeaderは画像ヘッダの割り当てのみであり、画像データの割り当ては行われていないことである.
4.関数呼び出しの例
以上の4つの方法はいずれも画像空間を作成することができる.
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*タイプの画像ヘッダポインタであり、この2つの関数の違いはcvCreateImageが画像ヘッダの割り当てに加えて画像データを割り当てていることであり、cvCreateImageHeaderは画像ヘッダの割り当てのみであり、画像データの割り当ては行われていないことである.
4.関数呼び出しの例
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include
#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つの方法はいずれも画像空間を作成することができる.