我正在开发一个游戏机器人并使用opencv,我试图让它检测到尖峰。FastFeatureDetector opencv C++筛选结果
尖峰是这样的:
我试图用一个FastFeatureDetector突出关键点,将得到以下结果:
的尖峰水平和变化colors.the操作是在一个完整的1920x1080屏幕
所以我的想法是采取其中一个点和比较对所有其他点X,因为我没有办法筛选结果和6094 KeyPoints操作花费太长时间。 (37136836次迭代)。
有没有办法来过滤FastFeatureDetector的结果,或者我应该以另一种方式来处理?
我的代码:
Point * findSpikes(Mat frame , int * num_spikes)
{
Point * ret = NULL;
int spikes_counter = 0;
Mat frame2;
cvtColor(frame , frame2 , CV_BGR2GRAY);
Ptr<FastFeatureDetector> myBlobDetector = FastFeatureDetector::create();
vector<KeyPoint> myBlobs;
myBlobDetector->detect(frame2 , myBlobs);
HWND wnd = FindWindow(NULL , TEXT("Andy"));
RECT andyRect;
GetWindowRect(wnd , &andyRect);
/*Mat blobimg;
drawKeypoints(frame2 , myBlobs , blobimg);*/
//imshow("Blobs" , blobimg);
//waitKey(1);
printf("Size of vectors : %d\n" , myBlobs.size());
for (vector<KeyPoint>::iterator blobIterator = myBlobs.begin(); blobIterator != myBlobs.end(); blobIterator++)
{
#pragma region FilteringArea
//filtering keypoints
if (blobIterator->pt.x > andyRect.right || blobIterator->pt.x < andyRect.left
|| blobIterator->pt.y > andyRect.bottom || blobIterator->pt.y < andyRect.top)
{
printf("Filtered\n");
continue;
}
#pragma endregion
for (vector<KeyPoint>::iterator comparsion = myBlobs.begin(); comparsion != myBlobs.end(); comparsion++)
{
//filtering keypoints
#pragma region FilteringRegion
if (comparsion->pt.x > andyRect.right || comparsion->pt.x < andyRect.left
|| comparsion->pt.y > andyRect.bottom || comparsion->pt.y < andyRect.top)
{
printf("Filtered\n");
continue;
}
printf("Processing\n");
double diffX = abs(blobIterator->pt.x - comparsion->pt.x);
if (diffX <= 5)
{
spikes_counter++;
printf("Spike added\n");
ret = (Point *) realloc(ret , sizeof(Point) * spikes_counter);
if (!ret)
{
printf("Memory error\n");
ret = NULL;
}
ret[spikes_counter - 1].y = ((blobIterator->pt.y + comparsion->pt.y)/2);
ret[spikes_counter - 1].x = blobIterator->pt.x;
break;
}
#pragma endregion
}
}
(*(num_spikes)) = spikes_counter;
return ret;//Modify later
}
我知道用C的realloc和printf的用法++我只是不喜欢cout和新
我们不喜欢'new',但我们已向前进步了'std :: vector <>' – MSalters
感谢您的回复,当我重新编码时,会考虑到这一点。 – Keddy1201