不定時更新
1. cvGet2D函數越界問題
CvScalar cvGet2D( const CvArr* arr, int idx0, int idx1 );
對於圖像中的某一像素點 P(x, y), 在我們正常的座標系中,x代表其橫座標,y代表其縱座標,而在opencv的函數 cvGet2D()與cvSet2D() 中,卻行不通。
idx0代表是的行,即高度,對應於我們平常座標系的y,
idx1代表的是列,即寬度,對應於我們平常座標系的x,
cvSet2D() 也類似。所以在使用cvSet2D() 與 cvGet2D() 時,千萬要注意座標的順序,是相反的。
即,要獲取圖像img中的某一像素點 P(x, y),調用時是cvGet2D( img, y, x );
2. 提取彩色前景
設提取了二值化的前景binaryImage,要提取彩色前景,另外創建一個圖片colorImage,在二值化圖片白色點處,就把當前幀(即包含背景前景的原始圖)pFrame 的像素值賦給colorImage,代碼如下
/*
*提取彩色前景
*已知:二值前景圖binaryImage,
* 當前幀圖像pFrame
*/
CvScalar s,s1;
IplImage* colorImage = cvCreateImage(cvSize(pFrame->width,
pFrame->height), IPL_DEPTH_8U, 3);
for(int i = 0; i < pFrame->width; i++){
for(int j = 0; j < pFrame->height; j++){
//⚠注意參數順序!(參考第1條筆記)
s1 = cvGet2D(binaryImage, j, i);
if( s1.val[0] == 255){
s = cvGet2D(pFrame, j, i);
cvSet2D(colorImge, j, i, s)
}
}
}
3.計算圖像的重心
Mat m;
bitwise_xor(threshold_img, Scalar(255), m);
Moments mon = moments(m, true);
int y_momnet = mon.m01 / mon.m00;
int x_momnet = mon.m10 / mon.m00;
4. Mat格式轉換爲指針格式
Mat m ; //設有一個float型Mat
float * f= (float *)m.data; //轉換爲指針型
5. 用指針來初始化Mat
// 設有一uchar型指針(或是數組)pArrayData
// pArray的大小爲height * width
// 則用pArrayData初始化Mat方法如下:
Mat m(height, width, CV_8UC1);
m.data = pArrayData;