Description
I encountered severe compilation errors and design inconsistencies when trying to use the pcl::2d::Keypoint module. It appears that the implementation of Keypoint in pcl/2d/impl/keypoint.hpp has not been updated to match the current API of its dependencies (pcl::2d::Convolution, pcl::2d::Edge, and pcl::2d::Kernel).
The code seems to rely on legacy methods that no longer exist or have been renamed, and there is a fundamental type incompatibility between Keypoint and Convolution.
Steps to Reproduce
-
Include pcl/2d/keypoint.h
-
Try to instantiate pcl::Keypoint with a standard PointCloud type or a vector type.
#include <pcl/2d/keypoint.h>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
int main() {
// Define the ImageType that meets the requirements of the source code (no longer PointCloud)
using ImageType = std::vector<std::vector<float>>;
int width = 20;
int height = 20;
ImageType input(height, std::vector<float>(width, 0.0f));
ImageType output;
for (int r = 5; r <= 15; ++r) {
for (int c = 5; c <= 15; ++c) {
input[r][c] = 255.0f;
}
}
pcl::Keypoint<ImageType> keypoint;
// Args: output, input, sigma_d, sigma_i, alpha, thresh
keypoint.harrisCorner (output, input, 1.0f, 2.0f, 0.04f, 1e-5f); // compile error
return 0;
}
Detailed Errors
I have identified the following critical issues in pcl/2d/impl/keypoint.hpp:
1. Missing Methods in Convolution
The Keypoint implementation calls methods on the conv_2d object (type pcl::Convolution) that do not exist:
- Called:
conv_2d.gaussianKernel(5, sigma, kernel_y);
- Reality:
pcl::Convolution has no gaussianKernel method. This method seems to belong to the pcl::kernel class.
- Called:
conv_2d.convolve(output, input, kernel_y);
- Reality:
pcl::Convolution uses the standard PCL Filter interface. The method is likely filter(), or the class usage is completely wrong here.
2. Missing Methods in Edge
The code calls edge_detection.ComputeDerivativeXCentral(...). However, this method only has a declaration and has not been implemented.
3. Fundamental Type Incompatibility
The pcl::Keypoint class seems to be written assuming ImageType is a std::vector<std::vector<T>> (nested vector), as seen by the access pattern input[i][j] in keypoint.hpp.
However, pcl::Convolution and pcl::Edge explicitly require pcl::PointCloud<PointT> as their template argument and input types.
- If I pass
pcl::PointCloud to Keypoint: keypoint.hpp fails because PointCloud does not support [i][j] indexing (it uses (col, row) or flat indexing).
- If I pass
std::vector<std::vector<T>> to Keypoint: convolution.h fails because it expects a class with .width, .height and points members.
Environment
- OS: 6.18.5-arch1-1
- Compiler: gcc 15.2.1
- PCL: Master branch
Description
I encountered severe compilation errors and design inconsistencies when trying to use the
pcl::2d::Keypointmodule. It appears that the implementation ofKeypointinpcl/2d/impl/keypoint.hpphas not been updated to match the current API of its dependencies (pcl::2d::Convolution,pcl::2d::Edge, andpcl::2d::Kernel).The code seems to rely on legacy methods that no longer exist or have been renamed, and there is a fundamental type incompatibility between
KeypointandConvolution.Steps to Reproduce
Include
pcl/2d/keypoint.hTry to instantiate
pcl::Keypointwith a standard PointCloud type or a vector type.Detailed Errors
I have identified the following critical issues in
pcl/2d/impl/keypoint.hpp:1. Missing Methods in
ConvolutionThe
Keypointimplementation calls methods on theconv_2dobject (typepcl::Convolution) that do not exist:conv_2d.gaussianKernel(5, sigma, kernel_y);pcl::Convolutionhas nogaussianKernelmethod. This method seems to belong to thepcl::kernelclass.conv_2d.convolve(output, input, kernel_y);pcl::Convolutionuses the standard PCL Filter interface. The method is likelyfilter(), or the class usage is completely wrong here.2. Missing Methods in
EdgeThe code calls
edge_detection.ComputeDerivativeXCentral(...). However, this method only has a declaration and has not been implemented.3. Fundamental Type Incompatibility
The
pcl::Keypointclass seems to be written assumingImageTypeis astd::vector<std::vector<T>>(nested vector), as seen by the access patterninput[i][j]inkeypoint.hpp.However,
pcl::Convolutionandpcl::Edgeexplicitly requirepcl::PointCloud<PointT>as their template argument and input types.pcl::PointCloudtoKeypoint:keypoint.hppfails because PointCloud does not support[i][j]indexing (it uses(col, row)or flat indexing).std::vector<std::vector<T>>toKeypoint:convolution.hfails because it expects a class with.width,.heightandpointsmembers.Environment