因為總是接觸過這樣一些#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個字節。