diff --git a/src/optflow/optflow-demo.cpp b/src/optflow/optflow-demo.cpp index 4ac63b472..4af2f44cc 100644 --- a/src/optflow/optflow-demo.cpp +++ b/src/optflow/optflow-demo.cpp @@ -76,11 +76,11 @@ int main(int argc, char **argv) { cv::Size frameBufferSize(WIDTH, HEIGHT); cv::UMat frameBuffer, videoFrame, resized, down, background, foreground(frameBufferSize, CV_8UC4, cv::Scalar::all(0)); - cv::UMat downPrevGrey, downNextGrey, downMaskGrey; + cv::UMat backgroundGrey, downPrevGrey, downNextGrey, downMaskGrey; - vector downFeaturePoints, downNewPoints, downPrevPoints, downNextPoints, downHull; + vector downNewPoints, downPrevPoints, downNextPoints, downHull; vector upPrevPoints, upNextPoints; - vector keypoints; + vector downPrevKeyPoints, keypoints; std::vector status; std::vector err; @@ -95,11 +95,11 @@ int main(int argc, char **argv) { cap >> videoFrame; if (videoFrame.empty()) break; - if(videoFrame.size() != frameBufferSize) + if(videoFrame.size().width != frameBufferSize.width || videoFrame.size().height != frameBufferSize.height) cv::resize(videoFrame, resized, frameBufferSize); else resized = videoFrame; - cv::resize(videoFrame, down, cv::Size(0, 0), SCALE_FACTOR, SCALE_FACTOR); + cv::resize(resized, down, cv::Size(0, 0), SCALE_FACTOR, SCALE_FACTOR); cv::cvtColor(resized, background, cv::COLOR_RGB2BGRA); cv::cvtColor(down, downNextGrey, cv::COLOR_RGB2GRAY); @@ -115,20 +115,21 @@ int main(int argc, char **argv) { cv::morphologyEx(downMaskGrey, downMaskGrey, cv::MORPH_OPEN, element, cv::Point(element.cols >> 1, element.rows >> 1), 2, cv::BORDER_CONSTANT, cv::morphologyDefaultBorderValue()); detector->detect(downMaskGrey, keypoints); - downFeaturePoints.clear(); + downPrevKeyPoints.clear(); for (const auto &kp : keypoints) { - downFeaturePoints.push_back(kp.pt); + downPrevKeyPoints.push_back(kp.pt); } - if (downFeaturePoints.size() > 4) { - cv::convexHull(downFeaturePoints, downHull); + if (downPrevKeyPoints.size() > 4) { + cv::convexHull(downPrevKeyPoints, downHull); float area = cv::contourArea(downHull); - float density = (downFeaturePoints.size() / area); - current_max_points = density * 25000.0; - size_t copyn = std::min(downFeaturePoints.size(), (size_t(std::ceil(current_max_points)) - downPrevPoints.size())); + float density = (downPrevKeyPoints.size() / area); + float stroke = 30.0 * sqrt(area / (SCALED_WIDTH * SCALED_HEIGHT * 4)); + current_max_points = density * 500000.0; + size_t copyn = std::min(downPrevKeyPoints.size(), (size_t(std::ceil(current_max_points)) - downPrevPoints.size())); if (downPrevPoints.size() < current_max_points) { - std::copy(downFeaturePoints.begin(), downFeaturePoints.begin() + copyn, std::back_inserter(downPrevPoints)); + std::copy(downPrevKeyPoints.begin(), downPrevKeyPoints.begin() + copyn, std::back_inserter(downPrevPoints)); } if (downPrevGrey.empty()) { @@ -149,14 +150,12 @@ int main(int argc, char **argv) { upNextPoints.push_back(pt /= SCALE_FACTOR); } - float stroke = 30.0 * sqrt(area / (SCALED_WIDTH * SCALED_HEIGHT * 4)); - using kb::nvg::vg; nvgBeginPath(vg); nvgStrokeWidth(vg, stroke); - nvgStrokeColor(vg, nvgHSLA(0.1, 1, 0.5, 48)); for (size_t i = 0; i < downPrevPoints.size(); i++) { + nvgStrokeColor(vg, nvgHSLA(0.1, 1, 0.55, 16)); if (status[i] == 1 && err[i] < (1.0 / density) && upNextPoints[i].y >= 0 && upNextPoints[i].x >= 0 && upNextPoints[i].y < HEIGHT && upNextPoints[i].x < WIDTH @@ -183,8 +182,12 @@ int main(int argc, char **argv) { gl::acquire_from_gl(frameBuffer); cv::flip(frameBuffer, frameBuffer, 0); - cv::addWeighted(foreground, 0.9, frameBuffer, 1.1, 0.0, foreground); - cv::addWeighted(background, 1.0, foreground, 1.0, 0.0, frameBuffer); + cv::subtract(foreground, cv::Scalar::all(8), foreground); + cv::add(foreground, frameBuffer, foreground); + cv::cvtColor(background, backgroundGrey, cv::COLOR_BGRA2GRAY); + cv::cvtColor(backgroundGrey, background, cv::COLOR_GRAY2BGRA); + cv::add(background, foreground, frameBuffer); + cv::cvtColor(frameBuffer, videoFrame, cv::COLOR_BGRA2RGB); cv::flip(frameBuffer, frameBuffer, 0);