我和我的同事们基于英特尔实感3D深度相机[D435]自行进行了斑点检测,现在我们必须将这种检测转变为一种识别。我们需要进行人员计数,因此我想我们必须将像素转换为图像,然后将其与另一幅图像进行比较,如果那大约是70%正确,则返回true。现在,我听说这对于该过程将是一项艰巨的任务,尤其是如果它必须在Raspberry Pi上运行时。我该怎么办?
我们目前正在从深度相机的最高点进行检查,如果该点在1至1.5米之间,它将使用一种方法,该方法将递归遍历其旁边的像素,直到它停止为止。 blobCheck 方法。
class Blob {
public:
map<Coords, int> blobList;
int blobIndex;
int MidPoint[2];
Mat* imRef;
Blob(vector<Blob>* list, Mat* imRef_) {
blobIndex = list->size() + 1;
imRef = imRef_;
}
bool loopCheck(int x, int y) {
if (blobList.size() == 0)
{
return true;
}
if (blobList.find(Coords(x, y)) != blobList.end()) {
return false;
}
return true;
}
void blobCheck(int x, int y, depth_frame* frame) {
float distance = frame->get_distance(x, y) + 0.05;
int step = 5;
float minHeight = 0.5;
try {
if (y - step <= 0 || x - step <= 0 || x >= frame->get_width() - step || y >= frame->get_height() - step || distance <= minHeight) {
return;
}
if (frame->get_distance(x, y - step) < distance) {
if (loopCheck(x, y - step)) {
blobList[Coords(x, y - step)] = 0;
blobCheck(x, y - step, frame);
}
}
if (frame->get_distance(x - step, y) < distance) {
if (loopCheck(x - step, y)) {
blobList[Coords(x - step, y)] = 0;
blobCheck(x - step, y, frame);
}
}
if (frame->get_distance(x, step + y) < distance) {
if (loopCheck(x, step + y)) {
blobList[Coords(x, step + y)] = 0;
blobCheck(x, step + y, frame);
}
}
if (frame->get_distance(x + step, y) < distance) {
if (loopCheck(x + step, y)) {
blobList[Coords(x + step, y)] = 0;
blobCheck(x + step, y, frame);
}
}
} catch (Exception) {}
}
};
现在我们有了一个包含所有像素的地图,该像素将使用以下代码显示斑点:
if (list.size() > 0) {
for (auto& mapItems : list[0].blobList) {
circle(*imRef, Point(mapItems.first.x, mapItems.first.y), 1, Scalar(255, 255, 255), 2);
}
}
您将可以在下图看到示例(不必单击即可,仅当您想查看示例时): Blob Detection