У меня есть кусок кода, который вычисляет SURF ключевые точки изображения и сохраняет их в yml
файл. Затем я пытаюсь загрузить этот файл и нарисовать сохраненные точки на изображении.
Ключевой момент и написать код:
cv::Mat img_1 = cv::imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE);
detectKeypointsImage(img_1);
int minHessian = 400;
cv::SurfFeatureDetector detector(minHessian);
std::vector<cv::KeyPoint> keypoints_1;
detector.detect(img_1, keypoints_1);
cv::Mat img_keypoints_1;
drawKeypoints(img_1, keypoints_1, img_keypoints_1);
cv::FileStorage fs("keypointsVW.yml", cv::FileStorage::WRITE);
write(fs, "keypoints_1", keypoints_1);
fs.release();
Чтобы проверить, сработало ли это, я закомментировал вышеуказанный блок минус следующие строки:
cv::Mat img_1 = cv::imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE);
cv::Mat img_keypoints_1;
Затем я использую следующий код, чтобы прочитать ключевые точки и нарисовать их на изображении:
std::vector<cv::KeyPoint> testPoints;
cv::FileStorage fs2("keypointsVW.yml", cv::FileStorage::READ);
cv::FileNode kptFileNode = fs2["keypointsVW"];
read(kptFileNode, testPoints);
fs2.release();
drawKeypoints(img_1, testPoints, img_keypoints_1);
cv::imshow("keypoints_1", img_keypoints_1);
Однако, когда программа запускается, она показывает изображение без каких-либо ключевых точек. Почему это происходит?
Я никогда не использовал функциональность хранилища, но по интуиции я подумал, что вы неправильно указали свой FileNode при загрузке данных.
Я проверил этот код, и он работает:
std::vector<cv::KeyPoint> testPoints;
cv::FileStorage fs2("keypointsVW.yml", cv::FileStorage::READ);
cv::FileNode kptFileNode = fs2["keypoints_1"]; // Here you must use the name that you used for writing the data within the file.
// You named it "keypoints_1" before.
// It must be the same name that you used in write(fs, "keypoints_1", keypoints_1);
// so for example write(storage, "nodeName", data); needs you to call cv::FileNode kptFileNode = fs2["nodeName"]; later
read(kptFileNode, testPoints);
fs2.release();
drawKeypoints(img_1, testPoints, img_keypoints_1);
cv::imshow("keypoints_1", img_keypoints_1);