Fix a bug in knnMatchConvert when a feature couldn't be matched #3632
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
After I started using a mask with
knnMatchAsync
, I found that the result fromknnMatchConvert
would be clipped at random.Investigating the issue, I found that
knnMatchAsync
will initialize alltrainIdx
to-1
, which will be overwritten by the CUDA kernel. A mask can be used to prevent certain features from being matched and this will prevent the CUDA kernel from setting the match distance.knnMatchConvert
is not properly incrementing the pointers whentrainIdx == -1
, so an unmatched feature will get it stuck atif (trainIdx == -1)
. Eventually the outer for-loop finishes and returns a vector with the matches up until the first missing match distance.My solution is to increment the counters the same way as a succesful iteration would.
Pull Request Readiness Checklist
See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request
Patch to opencv_extra has the same branch name.