123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- /*
- By downloading, copying, installing or using the software you agree to this license.
- If you do not agree to this license, do not download, install,
- copy or use the software.
- License Agreement
- For Open Source Computer Vision Library
- (3-clause BSD License)
- Copyright (C) 2000-2016, Intel Corporation, all rights reserved.
- Copyright (C) 2009-2011, Willow Garage Inc., all rights reserved.
- Copyright (C) 2009-2016, NVIDIA Corporation, all rights reserved.
- Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved.
- Copyright (C) 2015-2016, OpenCV Foundation, all rights reserved.
- Copyright (C) 2015-2016, Itseez Inc., all rights reserved.
- Third party copyrights are property of their respective owners.
- Redistribution and use in source and binary forms, with or without modification,
- are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
- * Neither the names of the copyright holders nor the names of the contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
- This software is provided by the copyright holders and contributors "as is" and
- any express or implied warranties, including, but not limited to, the implied
- warranties of merchantability and fitness for a particular purpose are disclaimed.
- In no event shall copyright holders or contributors be liable for any direct,
- indirect, incidental, special, exemplary, or consequential damages
- (including, but not limited to, procurement of substitute goods or services;
- loss of use, data, or profits; or business interruption) however caused
- and on any theory of liability, whether in contract, strict liability,
- or tort (including negligence or otherwise) arising in any way out of
- the use of this software, even if advised of the possibility of such damage.
- */
- /*
- Contributed by Gregor Kovalcik <gregor dot kovalcik at gmail dot com>
- based on code provided by Martin Krulis, Jakub Lokoc and Tomas Skopal.
- References:
- Martin Krulis, Jakub Lokoc, Tomas Skopal.
- Efficient Extraction of Clustering-Based Feature Signatures Using GPU Architectures.
- Multimedia tools and applications, 75(13), pp.: 8071–8103, Springer, ISSN: 1380-7501, 2016
- Christian Beecks, Merih Seran Uysal, Thomas Seidl.
- Signature quadratic form distance.
- In Proceedings of the ACM International Conference on Image and Video Retrieval, pages 438-445.
- ACM, 2010.
- */
- #include <opencv2/core.hpp>
- #include <opencv2/highgui.hpp>
- #include <opencv2/xfeatures2d.hpp>
- #include <iostream>
- #include <string>
- using namespace std;
- using namespace cv;
- using namespace xfeatures2d;
- void printHelpMessage(void);
- void printHelpMessage(void)
- {
- cout << "Example of the PCTSignatures algorithm computing and visualizing\n"
- "image signature for one image, or comparing multiple images with the first\n"
- "image using the signature quadratic form distance.\n\n"
- "Usage: pct_signatures ImageToProcessAndDisplay\n"
- "or: pct_signatures ReferenceImage [ImagesToCompareWithTheReferenceImage]\n\n"
- "The program has 2 modes:\n"
- "- single argument: program computes and visualizes the image signature\n"
- "- multiple arguments: program compares the first image to the others\n"
- " using pct signatures and signature quadratic form distance (SQFD)";
- }
- /** @brief
- Example of the PCTSignatures algorithm.
- The program has 2 modes:
- - single argument mode, where the program computes and visualizes the image signature
- - multiple argument mode, where the program compares the first image to the others
- using signatures and signature quadratic form distance (SQFD)
- */
- int main(int argc, char** argv)
- {
- if (argc < 2) // Check arguments
- {
- printHelpMessage();
- return 1;
- }
- Mat source;
- source = imread(argv[1]); // Read the file
- if (!source.data) // Check for invalid input
- {
- cerr << "Could not open or find the image: " << argv[1];
- return -1;
- }
- Mat signature, result; // define variables
- int initSampleCount = 2000;
- int initSeedCount = 400;
- int grayscaleBitsPerPixel = 4;
- vector<Point2f> initPoints;
- namedWindow("Source", WINDOW_AUTOSIZE); // Create windows for display.
- namedWindow("Result", WINDOW_AUTOSIZE);
- // create the algorithm
- PCTSignatures::generateInitPoints(initPoints, initSampleCount, PCTSignatures::UNIFORM);
- Ptr<PCTSignatures> pctSignatures = PCTSignatures::create(initPoints, initSeedCount);
- pctSignatures->setGrayscaleBits(grayscaleBitsPerPixel);
- // compute and visualize the first image
- double start = (double)getTickCount();
- pctSignatures->computeSignature(source, signature);
- double end = (double)getTickCount();
- cout << "Signature of the reference image computed in " << (end - start) / (getTickFrequency() * 1.0f) << " seconds." << endl;
- PCTSignatures::drawSignature(source, signature, result);
- imshow("Source", source); // show the result
- imshow("Result", result);
- if (argc == 2) // single image -> finish right after the visualization
- {
- waitKey(0); // Wait for user input
- return 0;
- }
- // multiple images -> compare to the first one
- else
- {
- vector<Mat> images;
- vector<Mat> signatures;
- vector<float> distances;
- for (int i = 2; i < argc; i++)
- {
- Mat image = imread(argv[i]);
- if (!source.data) // Check for invalid input
- {
- cerr << "Could not open or find the image: " << argv[i] << std::endl;
- return 1;
- }
- images.push_back(image);
- }
- pctSignatures->computeSignatures(images, signatures);
- Ptr<PCTSignaturesSQFD> pctSQFD = PCTSignaturesSQFD::create();
- pctSQFD->computeQuadraticFormDistances(signature, signatures, distances);
- for (int i = 0; i < (int)(distances.size()); i++)
- {
- cout << "Image: " << argv[i + 2] << ", similarity: " << distances[i] << endl;
- }
- waitKey(0); // Wait for user input
- }
- return 0;
- }
|