2008年7月6日 星期日

資料結構操作與運算-CvSize,CvScalar,CvArr資料結構

這邊的功能最主要是設定IplImage資料結構跟相關矩陣資料結構數據的部份,只要是圖形空間有關的設定大部分都用到CvSize,CvScalar.而CvArr只是個Interface,可以讓副程式容納IplImage資料結構及CvMat資料結構.對於很多的演算法副程式都是用CvArr來替代.

CvPoint,CvScalar,CvArr資料結構
#include <cv.h>
#include <stdio.h>
#include <highgui.h>

#include <stdlib.h>

void CreateEchelonIdentity(CvArr *Array,CvScalar Color)
{
    cvSetIdentity(Array,Color);
}
int main()
{
    IplImage *Image1;

    CvSize Size1=cvSize(320,240);
    CvSize2D32f Size2 =cvSize2D32f(640.0,480.0);

    CvScalar Scalar1=cvScalar(0,1,2,3);
    CvScalar Scalar2=cvRealScalar(10);
    CvScalar Scalar3=cvScalarAll(20);
    CvScalar Scalar4=CV_RGB(255,255,3);

    Image1=cvCreateImage(Size1,IPL_DEPTH_8U,3);
    CreateEchelonIdentity(Image1,Scalar4);

    printf("The Size1 height is : %d\n",Size1.height);
    printf("The Size1 width is : %d\n\n",Size1.width);

    printf("The Size2 height is : %.1f\n",Size2.height);
    printf("The Size2 width is : %.1f\n\n",Size2.width);

    printf("The Scalar1 is: (%.1f,%.1f,%.1f,%.1f)\n",Scalar1.val[0],Scalar1.val[1],Scalar1.val[2],Scalar1.val[3]);
    printf("The Scalar2 is: (%.1f,%.1f,%.1f,%.1f)\n",Scalar2.val[0],Scalar2.val[1],Scalar2.val[2],Scalar2.val[3]);
    printf("The Scalar3 is: (%.1f,%.1f,%.1f,%.1f)\n\n",Scalar3.val[0],Scalar3.val[1],Scalar3.val[2],Scalar3.val[3]);

    printf("The Scalar4 is: (%.1f,%.1f,%.1f,%.1f)\n",Scalar4.val[0],Scalar4.val[1],Scalar4.val[2],Scalar4.val[3]);

    cvNamedWindow("Echelon Identity",1);
    cvShowImage("Echelon Identity",Image1);

    cvWaitKey(0);

}

執行結果:


上面的程式除了做CvSize,CvScalar各種資料結構跟CvArr的應用,還有一段是顯示列梯形矩陣的單位矩陣(I),用黃色來表示,cvSize相關的資料結構還有cvSize2D32f,而CvScalar則有許多應用,cvScalar()為初始化資料結構,CvScalar可以輸入四個引數為double型別,而cvRealScalar()則是只有一個引數有值,這邊CvScalar其實是放在double型別val的陣列裡面的,cvRealScalar()會只讓val[0]有值存進去,cvScalarAll()則是四個陣列都是同一個數,CV_RGB()會讓它第四個陣列的數為0而且val[0],val[1],val[2]為BGR排列.

(1)CvSize資料結構   (2)CvSize2D32f資料結構
    

(1)CvScalar資料結構


至於CvArr,它只是一個Interface,在"cxtype.h"被定義為

typedef void CvArr;

專門處理矩陣資料結構的介面.

cvSize()
初始化CvSize資料結構,分別填入int型別的寬度跟高度數據
cvSize(int型別寬度數據,int型別高度數據)

cvSize2D32f()
初始化cvSize2D32f資料結構,分別填入float型別的寬度跟高度數據
cvSize2D32f(float型別寬度數據,float型別高度數據)

cvScalar()
初始化CvScalar資料結構,有四個純量參數輸入為double型別
cvScalar(第一個通道純量數據,第二個通道純量數據,第三個通道純量數據,第四個通道純量數據)

cvRealScalar()
輸入為單一一個純量的參數,存入CvScalar會變成val[0]=引數1,val[1]=val[2]=val[3]=0
cvRealScalar(第一個通道純量數據)

cvScalarAll()
四個純量都是同一個輸入的數字,通常為灰階的形態
cvScalarAll(輸入全部純量值的數據)

CV_RGB()
依照OpenCV的RGB模式輸入,第一個引數為R值,第二個引數為G值,第三個引數為B值,但是存入CvScalar資料結構會相反,val[0]=B值,val[1]=G值,val[2]=R值,val[3]=0,因此CV_RGB()在"cxcore.h"被定義為

#define CV_RGB( r, g, b ) cvScalar( (b), (g), (r), 0 )

CV_RGB(R值數據,G值數據,B值數據)

cvSetIdentity()
對IplImage及CvMat資料結構設立單位矩陣,並給單位矩陣的位置一個CvScalar顏色(純量)資料結構,cvSetIdentity()則會在單位矩陣位置上著上顏色(配置純量)
cvSetIdentity(IplImage資料結構或CvMat資料結構,CvScalar顏色資料結構)



4 意見:

匿名 提到...

您好,printf Scalar2~Scalar4的引數您都打成Scalar1.val[0]了,圖也是錯的^^"

yester 提到...

感謝指正喔

謝謝您^^

匿名 提到...

您好,請問若要限定圖像的某一部分做直方圖等化,該從哪個函式下手?
例如:圖為512*512,以左上角為(0,0),x軸向右延伸,y軸向下延伸,而限定範圍為(30,30),(60,30),(30,60),(60,60)

匿名 提到...

請問一下cvscalar的型別是什麼呢?

Copyright 2008-2009,yester