OpenCV tricks 筆記

不定時更新


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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章