diff --git a/grayMatch.cpp b/grayMatch.cpp index 5355373..fb5b542 100644 --- a/grayMatch.cpp +++ b/grayMatch.cpp @@ -428,11 +428,24 @@ Model *trainModel(const cv::Mat &src, int level) { auto *result = new Model; Model &model = *result; - cv::buildPyramid(src, model.pyramids, level); - model.borderColor = cv::mean(src).val[ 0 ] < 128 ? 255 : 0; - model.reserve(model.pyramids.size()); - for (const auto &pyramid : model.pyramids) { + std::vector pyramids; + cv::buildPyramid(src, pyramids, level); + model.borderColor = cv::mean(src).val[ 0 ] < 128 ? 255 : 0; + model.reserve(pyramids.size()); + + for (const auto &pyramid : pyramids) { + int alignedWidth = static_cast(cv::alignSize(pyramid.cols, cv::v_uint8::nlanes)); + auto img = cv::Mat::zeros(pyramid.rows, alignedWidth, CV_8UC1); + cv::Mat sub = img(cv::Rect(0, 0, pyramid.cols, pyramid.rows)); + for (int y = 0; y < pyramid.rows; y++) { + auto *dstPtr = sub.ptr(y); + auto *srcPtr = pyramid.ptr(y); + memcpy(dstPtr, srcPtr, pyramid.cols); + } + + model.pyramids.push_back(sub); + auto invArea = 1. / pyramid.size().area(); cv::Scalar mean; diff --git a/privateType.h b/privateType.h index 91dcc71..a8a028d 100644 --- a/privateType.h +++ b/privateType.h @@ -26,6 +26,7 @@ struct Model { } void reserve(const std::size_t size) { + pyramids.reserve(size); normal.reserve(size); invArea.reserve(size); mean.reserve(size);