介紹
光流是由物體或照相機(jī)的運(yùn)動(dòng)引起的兩個(gè)連續(xù)幀之間圖像物體視在運(yùn)動(dòng)的模式。它是2D向量場(chǎng),其中每個(gè)向量都是位移向量,顯示點(diǎn)從第一幀到第二幀的運(yùn)動(dòng)。
光流在以下領(lǐng)域有許多應(yīng)用:
- 運(yùn)動(dòng)結(jié)構(gòu)
- 視頻壓縮
- 視頻穩(wěn)定
光流的工作基于以下幾個(gè)假設(shè):
- 物體的像素強(qiáng)度在連續(xù)的幀之間不改變。
- 相鄰像素具有相似的運(yùn)動(dòng)。
實(shí)現(xiàn)
在OpenCV中實(shí)現(xiàn)光流的步驟
1 查找一些關(guān)鍵點(diǎn)
在例子中我們用goodFeaturesToTrack函數(shù)來(lái)查找關(guān)鍵點(diǎn)。函數(shù)原型:
void cv::goodFeaturesToTrack( InputArray _image, OutputArray _corners,
int maxCorners, double qualityLevel, double minDistance,
InputArray _mask, int blockSize,
bool useHarrisDetector, double harrisK )
2 迭代跟蹤這些點(diǎn)
例子中用calcOpticalFlowPyrLK來(lái)計(jì)算光流。函數(shù)原型:
void cv::calcOpticalFlowPyrLK( InputArray _prevImg, InputArray _nextImg,
InputArray _prevPts, InputOutputArray _nextPts,
OutputArray _status, OutputArray _err,
Size winSize, int maxLevel,
TermCriteria criteria,
int flags, double minEigThreshold )
根據(jù)我的理解,在當(dāng)前幀查找一些關(guān)鍵點(diǎn),然后根據(jù)這些關(guān)鍵點(diǎn),在下一幀進(jìn)行匹配,得到這些點(diǎn)在下一幀的位置。這樣就得到了了一組向量,表示了當(dāng)前幀和下一幀之前點(diǎn)的移動(dòng),也就實(shí)現(xiàn)了對(duì)一些物體的跟蹤。
官方例子
#include
#include
#include
#include
#include
#include
using namespace cv;
using namespace std;
int main(int argc, char **argv)
{
const string about =
"This sample demonstrates Lucas-Kanade Optical Flow calculation.\\n"
"The example file can be downloaded from:\\n"
" https://www.bogotobogo.com/python/OpenCV_Python/images/mean_shift_tracking/slow_traffic_small.mp4";
const string keys =
"{ h help | | print this help message }"
"{ @image | vtest.avi | path to image file }";
CommandLineParser parser(argc, argv, keys);
parser.about(about);
if (parser.has("help"))
{
parser.printMessage();
return 0;
}
string filename = samples::findFile(parser.get
運(yùn)行結(jié)果截圖
審核編輯:劉清
-
OpenCV
+關(guān)注
關(guān)注
31文章
635瀏覽量
41374 -
python
+關(guān)注
關(guān)注
56文章
4797瀏覽量
84755 -
printf函數(shù)
+關(guān)注
關(guān)注
0文章
31瀏覽量
5896
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論