Thursday, April 1, 2010

โครงสร้างของรูปใน OpenCV

รูปใน OpenCV จะถูกเก็บด้วยตัวแปรโครงสร้างชื่อ IplImage ซึ่งมีรายละเีอียดดังนี้

typedef struct _IplImage
{
int nSize;
int ID;
int nChannels; //ชั้นของสี อยู่ระหว่าง 1-4 (สีเทา แดง เขียว น้ำเงิน อัลฟ่า)
int alphaChannel;
int depth; //ความลึกของบิต (bit depth) ตั้งแต่ 8-64 บิต มีชื่อเฉพาะ
char colorModel[4];
char channelSeq[4];
int dataOrder;
int origin;
int align;
int width; //ความกว้างของภาพ
int height; //ความสูงของภาพ
struct _IplROI *roi;
struct _IplImage *maskROI;
void *imageId;
struct _IplTileInfo *tileInfo;
int imageSize; //ขนาดของรูปในหน่วยไบต์ = height*widthStep
char *imageData; //พอยน์เตอร์ที่ชี้ไปยังแถวแรกของภาพ
int widthStep; //จำนวนไบต์ระหว่างสองพิกเซลที่อยู่ในคอลัมน์เดียวกัน แต่คนละแถว
int BorderMode[4];
int BorderConst[4];
char *imageDataOrigin;
}
IplImage;

รายละเอียดเพิ่มเติมสามารถหาดูได้ที่
http://opencv.willowgarage.com/documentation/c/basic_structures.html#index-714
http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/index.html

ซึ่งทำให้เราจินตนาการได้ว่า การเก็บรูปใน OpenCV จะไม่ใช่เป็นแบบเมตริกซ์สองมิติธรรมดา แต่จะเป็นดังรูปต่อไปนี้ (สมมติว่าเป็นรูป grayscale)
นั่นคือ รูปใน OpenCV จะถูกเก็บในหน่วยความจำเรียงต่อๆกันไปเหมือนอาร์เรย์ 1 มิติหรือเวกเตอร์
พิกเซลที่ (0,0) ก็จะเทียบได้กับตำแหน่งที่ 0
พิกเซลที่ (0,1) ก็จะเทียบได้กับตำแหน่งที่ 1
พิกเซลที่ (1,0) ก็จะเทียบได้กับตำแหน่งที่ widthStep
พิกเซลที่ (1,1) ก็จะเทียบได้กับตำแหน่งที่ widthStep+1
พิกเซลที่ (2,1) ก็จะเทียบได้กับตำแหน่งที่ 2*widthStep
.....

พิกเซลที่ (r,c) ก็จะเทียบได้กับตำแหน่งที่ r*widthStep+c นั่นเอง

ดังนั้น หากต้องการใช้ลูปเพื่อประมวลผลพิกเซล จะสามารถใช้รหัสดังต่อไปนี้ได้


ลองดูตัวอย่างการใช้งานในบทความถัดไปได้ครับ

No comments:

Post a Comment