當物件偵測(Object Detection)的程式完成後,想利用 OpenCV 編寫一個可以追蹤物件(Object Tracking)的程式,當然是為了智能小車作物件追蹤,將物件的特性設定好,智能小車便會追蹤或找尋物件。其實物件追蹤程式是將物件偵測後的位置記錄下來,然後再處理圖片,從矩狀態找出物件位置(X,Y),將物件位置記錄,並一直保存在位置圖片上,再合成影像圖片和位置圖片,最後顯示合成圖片便可以。
OpenCV 2.4 的物件追蹤(Object Tracking) |
void cvMoments( const CvArr* arr, CvMoments* moments, int binary=0 );
參數說明如下:
1‧arr = 圖像 (1-通道或 3-通道,有 COI 設置) 或多邊形(點的 CvSeq 或一族點的向量)。
2‧moments = 返回的矩狀態介面的指針。
3‧binary = (僅對圖像) 如果標識為非零,則所有零象素點被當成零,其他的被看成 1。
函數 cvMoments 計算最高達三階的空間和中心矩,並且將結果存在結構 moments 中。矩用來計算形狀的重心,面積,主軸和其他的形狀特徵,如 7 Hu 不變數等。
cvGetSpatialMoment 從矩狀態結構中提取空間矩函數:
double cvGetSpatialMoment( CvMoments* moments, int x_order, int y_order );
參數說明如下:
1‧moments = 矩狀態,由 cvMoments 計算。
2‧x_order = 提取的 x 次矩,x_order >= 0。
3‧y_order = 提取的 y 次矩,y_order >= 0 並且 x_order + y_order <= 3。
函數 cvGetSpatialMoment 提取空間矩,當圖像矩被定義為:
Mx_order,y_order=sumx,y(I(x,y)•xx_order•yy_order),其中 I(x,y) 是象素點 (x, y) 的亮度值。
GetCentralMoment 從矩狀態結構中提取中心矩函數:
double cvGetCentralMoment( CvMoments* moments, int x_order, int y_order );
參數說明如下:
1‧moments = 矩狀態結構指針。
2‧x_order = 提取的 x 階矩,x_order >= 0。
3‧y_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 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%
天氣:大致多雲