Effective and efficient generation of keypoints from an image is a well-studied problem in the literature and forms the basis of numerous Computer Vision applications. Established leaders in the field are the SIFT and SURF algorithms which exhibit great performance under a variety of image transformations, with SURF in particular considered as the most computationally efficient amongst the high-performance methods to date.
Since the OpenCV brisk-detector is broken Bug #2491 and the original code can't be compiled with new OpenCV versions (conflicting names), I've forked the original code and made some minor tweaks and a new python wrapper.
BRISK package: Source Code Release v0.0 Copyright 2011 Autonomous Systems Lab (ASL), ETH Zurich Stefan Leutenegger, Simon Lynen and Margarita Chli
License: BSD (see license file included in this folder)
This software is an implementation of [1]:
[1] Stefan Leutenegger, Margarita Chli and Roland Siegwart, BRISK:
Binary Robust Invariant Scalable Keypoints, in Proceedings of the
IEEE International Conference on Computer Vision (ICCV2011).
- OpenCV
- cmake
- Python (dev)
- Numpy
Download the source code
cd ${brisk-dir} wget https://github.com/clemenscorny/brisk/archive/master.zip unzip master.zip cd brisk-masterCreate the Makifile with cmake
mkdir build cd build cmake .. # or # cmake .. -DBUILD_PYTHON_BINDING=OFF # to build without python wrapperBuild the project
makeThe built files files are stored in ${brisk-dir}/brisk-master/build/bin and ${brisk-dir}/brisk-master/build/lib
Navigate to the bin folder and run the demo
cd ${brisk-dir}/brisk-master/build/bin/ ./demoAdd the python wrapper folder to the python path
export PYTHONPATH=${brisk-dir}/brisk-master/build/lib:$PYTHONPATHand run
import brisk import cv2 img = cv2.imread('path/to/an/image.png') b = brisk.Brisk() # detector kpts = b.detect(img) # desriptor kpts, features = b.compute(img, kpts) # draw and show keypoints in the image cv2.imshow('Brisk', cv2.drawKeypoints(img, kpts, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)) cv2.waitKey()Take a look at demo.cpp
Important note: This brisk implementation (original implementation) doesn't calculate the angles in brisk::BriskFeatureDetector::detect. Use this piece of code to compute it
cv::Mat img; // use for example cv::imread to load an image cv::Ptr<cv::FeatureDetector> detector; detector = new brisk::BriskFeatureDetector(60, 4); std::vector<cv::KeyPoint> keypoints; detector->detect(img, keypoints); // keypoints have invalid angles // keypoints[i].angle is every time -1 // code of interest // brisk::BriskDescriptorExtractor::BriskDescriptorExtractor needs some computation // time. (But you don't have to create for every new image a new new instance of // this class). brisk::BriskDescriptorExtractor* descriptor_extractor = new brisk::BriskDescriptorExtractor(); descriptor_extractor->computeAngles(img, keypoints); // keypoints have valid angles // keypoints[i].angle works