2015年10月31日 星期六

OpenCV 2.4 的物件追蹤(Object Tracking)– cvMoments 函數

OpenCV 2.4 的物件追蹤(Object Tracking)– cvMoments 函數: 

物件偵測(Object Detection)的程式完成後,想利用 OpenCV 編寫一個可以追蹤物件(Object Tracking)的程式,當然是為了智能小車作物件追蹤,將物件的特性設定好,智能小車便會追蹤或找尋物件。其實物件追蹤程式是將物件偵測後的位置記錄下來,然後再處理圖片,從矩狀態找出物件位置(XY),將物件位置記錄,並一直保存在位置圖片上,再合成影像圖片和位置圖片,最後顯示合成圖片便可以。

OpenCV 2.4 的物件追蹤(Object Tracking
cvMoments 求取圖像的重心函數: 
void cvMoments( const CvArr* arr, CvMoments* moments, int binary=0 ); 

參數說明如下: 
1arr = 圖像 (1-通道或 3-通道,有 COI 設置) 或多邊形(點的 CvSeq 或一族點的向量)
2moments = 返回的矩狀態介面的指針。
3binary = (僅對圖像) 如果標識為非零,則所有零象素點被當成零,其他的被看成 1

函數 cvMoments 計算最高達三階的空間和中心矩,並且將結果存在結構 moments 中。矩用來計算形狀的重心,面積,主軸和其他的形狀特徵,如 7 Hu 不變數等 

cvGetSpatialMoment 從矩狀態結構中提取空間矩函數: 
double cvGetSpatialMoment( CvMoments* moments, int x_order, int y_order ); 

參數說明如下: 
1moments = 矩狀態,由 cvMoments 計算。 
2x_order = 提取的 x 次矩,x_order >= 0 
3y_order = 提取的 y 次矩,y_order >= 0 並且 x_order + y_order <= 3 

函數 cvGetSpatialMoment 提取空間矩,當圖像矩被定義為: 
Mx_order,y_order=sumx,y(I(x,y)xx_orderyy_order),其中 I(x,y) 是象素點 (x, y) 的亮度值。

GetCentralMoment 從矩狀態結構中提取中心矩函數:
double cvGetCentralMoment( CvMoments* moments, int x_order, int y_order ); 

參數說明如下: 
1moments = 矩狀態結構指針。 
2x_order = 提取的 x 階矩,x_order >= 0
3y_order = 提取的 y 階矩,y_order >= 0 x_order + y_order <= 3

函數 cvGetCentralMoment 提取中心矩,其中圖像矩的定義是:
μx_order,y_order=sumx,y(I(x,y)(x-xc)x_order(y-yc)y_order),其中 xc=M10/M00, yc=M01/M00 - 重心坐標。

物件追蹤(Object Tracking)程式:
// 物件追蹤(Object Tracking)程式
// cvMoments 函數

     img_dest=cvCloneImage(img_source);

     // First tracking to setup imgTracking Image
      if (track == 0) {
    
//create a blank image and assigned to 'imgTracking' which has the same size of original video
           imgTracking=cvCreateImage(cvGetSize(img_source),IPL_DEPTH_8U, 3);
           cvZero(imgTracking); //covert the image, 'imgTracking' to black
           lastX = -1;
           lastY = -1;
           track = 1;}

      // Repeat functions in below
//smooth the original image using Gaussian kernel
         cvSmooth(img_dest, img_dest, CV_GAUSSIAN,3,3);

     IplImage* imgHSV = cvCreateImage(cvGetSize(img_dest), IPL_DEPTH_8U, 3);
     cvCvtColor(img_dest, imgHSV, CV_BGR2HSV); //Change the color format from BGR to HSV
           
     //This function threshold the HSV image and create a binary image
     IplImage* imgThresh=cvCreateImage(cvGetSize(imgHSV),IPL_DEPTH_8U, 1);
     cvInRangeS(imgHSV, cvScalar(170,160,60), cvScalar(180,2556,256), imgThresh);

     //smooth the binary image using Gaussian kernel
     cvSmooth(imgThresh, imgThresh, CV_GAUSSIAN,3,3);
           
     /// Calculate the moments of 'imgThresh'
     CvMoments *moments = (CvMoments*)malloc(sizeof(CvMoments));
    cvMoments(imgThresh, moments, 1);
     double moment10 = cvGetSpatialMoment(moments, 1, 0);
    double moment01 = cvGetSpatialMoment(moments, 0, 1);
    double area = cvGetCentralMoment(moments, 0, 0);

    if(area>1000){
        // calculate the position of the ball
        int posX = moment10/area;
        int posY = moment01/area;       
       
       if(lastX>=0 && lastY>=0 && posX>=0 && posY>=0)
        {
            // Draw a yellow line from the previous point to the current point
4);
            cvLine(imgTracking, cvPoint(posX, posY), cvPoint(lastX, lastY), cvScalar(0,0,255), 20);
        }
        lastX = posX;
        lastY = posY;
     }
   free(moments);

                // Add the tracking image and the frame
                cvAdd(img_dest, imgTracking, img_dest);

     // create window and show the image in PictureBox2 Format24bppRgb Format8bppIndexed
        pictureBox2->Image  = gcnew System::Drawing::Bitmap(img_dest->width,img_dest->height,
                img_dest->widthStep,System::Drawing::Imaging::PixelFormat::Format24bppRgb,
                (System::IntPtr) img_dest->imageData);
                pictureBox2->Refresh();

                //Clean up used images
                cvReleaseImage(&imgHSV);
                cvReleaseImage(&imgThresh);           
                cvReleaseImage(&img_dest);

                //Clean up used Memory
                cvReleaseMemStorage(&storage);
                //Clean up used Memory
                cvReleaseMemStorage(&storage);

操作系統:Windows XP 32-bit 
操作環境:Windows Visual Studio 2010 + OpenCV 2.4.8

相關網址:
※ 在 Windows XP Visual Studio 2010 安裝 OpenCV 2.4
※ 在 Windows XP Visual Studio 2010 使用 OpenCV 2.4 第一個程式
※ 在 Windows XP Visual Studio 2010 使用 OpenCV 2.4 使用 WebCam
※ 在 Windows XP Visual Studio 2010 安裝使用 FFmpeg 函數庫
※ 在 Windows XP Visual Studio 2010 使用 OpenCV 2.4 使用 WebCam
※ 在 Windows XP Visual Studio 2010 使用 OpenCV 2.4 顯示 IPCam 串流視頻
※ 在 Windows XP Visual Studio 2010 使用 OpenCV 2.4 導入屬性工作表文件檔
※ 在 Windows XP Visual Studio 2010 使用 Windows From OpenCV 2.4 配置
※ 在 OpenCV 2.4 的 IplImage 資料結構
※ OpenCV 2.4 的坎尼圖像邊緣檢測(Canny Edge Detection) – Canny 函數
※ OpenCV 2.4 的霍夫直線偵測轉換 – HoughLines 函數
※ OpenCV 2.4 的霍夫直線偵測轉換 – HoughLinesP 函數
※ OpenCV 2.4 的人臉偵測(Face Detection)– cvHaarDetectObjects 函數
※ OpenCV 2.4 的物件偵測(Object Detection)– cvHoughCircles 函數
※ OpenCV 2.4 的物件追蹤(Object Tracking)– cvMoments 函數

參考網址:
※ Cv圖像處理

2015 年 10月 31日 天氣報告
氣溫:25.1@ 21:20
相對濕度:百分之 79%
天氣:大致多雲

沒有留言:

張貼留言