opencv里面CV_32FC1家族


因為總是接觸過這樣一些#define里面的東西但是總也不知道是干什么用的。而且每看一次夢比一次。

 

對於這些東西到底是什么的簡寫根本就不能理解。

原意是跑一下這個例程的:

cvRectangle(
        myMat,
        cvPoint(5, 10),
        cvPoint(20, 30),
        cvScalar(50, 50, 200)
        );

可是第二章就練習了 IplImage這個結構,對於cvMat簡直就不知所雲,然后第一版:

 

CvMat *myMat;
    cvRectangle(
        myMat,
        cvPoint(5, 10),
        cvPoint(20, 30),
        cvScalar(50, 50, 200)
        );

 

然后就想顯示,這必然是不能跑,因為沒有實例化,沒有分配內存空間,還想在所謂的畫布上畫圖像,應該是不行。

所以找來了明傑同學,他也是很熱心的但是說對於這個cvmat也不是很熟。於是就這樣跑起來了。

 

IplImage *myImg=cvCreateImage(cvSize(500,500),8,3);
    cvZero(myImg);
    cvRectangle(
        myImg,
        cvPoint(5, 10),
        cvPoint(20, 30),
        cvScalar(50, 50, 200)
        );
    cvNamedWindow("Example6", CV_WINDOW_AUTOSIZE);
    cvShowImage("Example6", myImg);
    cvWaitKey(0);

 

能跑了好開心,然后看着他幫我調顏色也就是cvScalar 我想這個單詞應該是讀作:color的把就跟class都寫成成clazz一樣。/*然后跟我熟悉的rgb有出入的點在於這個里面是bgr也就是第一個參數是藍色第二個是綠色第三個參數是紅色,我記得不論是我之前的ps課程還是后面的一些android的點,或者h5里面那個顏色都是rgb的。好吧,不管了。可能是ps先入為主了,然后大家就都rgb了。這不重要。*/

然后他不熟,我這書還得往下看,到底這個cvmat怎么創建圖像,

翻到例子3-4 發現了

 

CvMat *mat= cvCreateMat(5, 5, CV_32FC1);

 

我就琢磨是不是能寫一個cvmat的東西。

然后根據(5,10)(20,30)就把這個矩陣的形狀改成了:

CvMat *mat= cvCreateMat(50, 50, CV_32FC1);

可是剛剛的顏色沒了。

F12進去:

 

 

#define CV_32FC1 CV_MAKETYPE(CV_32F,1)①

 

 

 

#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))②

 

 

 

#define CV_32F  5

 

 

 

#define CV_MAT_DEPTH(flags)     

 

#define CV_MAT_DEPTH_MASK       (CV_DEPTH_MAX - 1)//7

 

 

 

#define CV_DEPTH_MAX  (1 << CV_CN_SHIFT)//shift是3.1<<3 是8.

 

 

 

#define CV_CN_SHIFT   3

 

剛的顏關於這堆東西就是一大堆的變量代入,思路要清楚:

 

我就是想要CV_32FC1 它是:CV_MAKETYPE(CV_32F,1) 它是②

 

②式需要CV_MAT_DEPTH(depth) CV_CN_SHIFT

 

=

=

=+

=+

=+

=+

=+

 

=5&1左移3-1+0左移3位)

 

=5&8-1+0

 

=5

 

等我都特么花了半晌兒推出來了,覺得是不是要檢測一下是否正確:

 

發現輸出結果果然是5,婊婊忽然想到了什么,一開始 直接輸出不就完了,我還費這么大勁推一邊。。。

 

然后是可以接着把他們一家子

std::cout << CV_32FC1 << std::endl;

std::cout << CV_32FC2 << std::endl;

std::cout << CV_32FC3 << std::endl;

std::cout << CV_32FC4 << std::endl;

都輸出來,看一下,然后就看到了這一堆define

思考着為什么不能出來結果然后就不斷地換這個

CvMat *mat= cvCreateMat(50, 50, CV_32FC1);

最后的參數,直到,換了幾個,然后看到了這個:

#define CV_8U   0 //8位無符號整形?

#define CV_8S   1

#define CV_16U  2

#define CV_16S  3

#define CV_32S  4

#define CV_32F  5

#define CV_64F  6

#define CV_USRTYPE1 7

感覺估計是這個意思,后面的c代表通道,前面就是8位無符號,有符號,16位無符號有符號,浮點型等等。后面還給了一個預置的用戶類型。

 

然后就又回來發呆:

IplImage *myImg=cvCreateImage(cvSize(500,500),8,3);

這個8是位長,3是通道數,於是

瞬間覺得要把 這個后面的參數改成:CV_8UC3,然后

奇跡發生了,圖像有色了。然后才有了前面試出了這個顏色的通道分別是bgr

 

然后開始想,還是對這個矩陣表示圖像不是很理解。

同樣是創建用來顯示的圖像給了cvMat形式 給了IplImage形式。那么他們都應該有行列,這個顯而易見,后面的應該也是一樣的,所以這個后面的這堆define就是連同位數和通道都寫了的。所以才能用來創建一幅圖片。

 

//完成opencv矩陣的初始化。
    float vals[] = {0.866025,-0.500000,0.500000,0.866025};
    CvMat rotmat;
    cvInitMatHeader(
        &rotmat,//引用
        2,//2行
        2,//2列
        CV_32FC1,//32位float型
        vals//參數內容
        );

 

F:\opencv249\opencv\build\include\opencv2\core\types_c.h

關於CvMat的相關描述

 

typedef struct CvMat
{
    int type;
    int step;
    /* for internal use only */
    int* refcount;
    int hdr_refcount;
    union
    {
        uchar* ptr;
        short* s;
        int* i;
        float* fl;
        double* db;
    } data;

#ifdef __cplusplus
    union
    {
        int rows;
        int height;
    };
    union
    {
        int cols;
        int width;
    };
#else
    int rows;
    int cols;
#endif
}
CvMat;
/*
int * p;
double *pd;
char *pc;
short *ps;
float *pf;
cout << sizeof(char) << endl;
cout << sizeof(short) << endl;
cout << sizeof(int) << endl;
cout << sizeof(float) << endl;
cout << sizeof(double) << endl;
cout << sizeof(p) << endl;
cout << sizeof(pd) << endl;
cout << sizeof(pc) << endl;
cout << sizeof(ps) << endl;
*/

這個 CvMat是20個字節。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM