171 lines
5.9 KiB
C++
171 lines
5.9 KiB
C++
|
/*
|
|||
|
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<EFBFBD>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.\n\n"
|
|||
|
"This program computes and visualizes position-color-texture signatures\n"
|
|||
|
"using images from webcam if available.\n\n"
|
|||
|
"Usage:\n"
|
|||
|
"pct_webcam [sample_count] [seed_count]\n"
|
|||
|
"Note: sample_count must be greater or equal to seed_count.";
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/** @brief
|
|||
|
|
|||
|
Example of the PCTSignatures algorithm.
|
|||
|
|
|||
|
This program computes and visualizes position-color-texture signatures
|
|||
|
of images taken from webcam if available.
|
|||
|
*/
|
|||
|
int main(int argc, char** argv)
|
|||
|
{
|
|||
|
// define variables
|
|||
|
Mat frame, signature, result;
|
|||
|
int initSampleCount = 2000;
|
|||
|
int initSeedCount = 400;
|
|||
|
int grayscaleBitsPerPixel = 4;
|
|||
|
|
|||
|
// parse for help argument
|
|||
|
{
|
|||
|
for (int i = 1; i < argc; i++)
|
|||
|
{
|
|||
|
if ((string)argv[i] == "-h" || (string)argv[i] == "--help")
|
|||
|
{
|
|||
|
printHelpMessage();
|
|||
|
return 0;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// parse optional arguments
|
|||
|
if (argc > 1) // sample count
|
|||
|
{
|
|||
|
initSampleCount = atoi(argv[1]);
|
|||
|
if (initSampleCount <= 0)
|
|||
|
{
|
|||
|
cerr << "Sample count have to be a positive integer: " << argv[1] << endl;
|
|||
|
return 1;
|
|||
|
}
|
|||
|
initSeedCount = (int)floor(static_cast<float>(initSampleCount / 4));
|
|||
|
initSeedCount = std::max(1, initSeedCount); // fallback if sample count == 1
|
|||
|
}
|
|||
|
if (argc > 2) // seed count
|
|||
|
{
|
|||
|
initSeedCount = atoi(argv[2]);
|
|||
|
if (initSeedCount <= 0)
|
|||
|
{
|
|||
|
cerr << "Seed count have to be a positive integer: " << argv[2] << endl;
|
|||
|
return 1;
|
|||
|
}
|
|||
|
if (initSeedCount > initSampleCount)
|
|||
|
{
|
|||
|
cerr << "Seed count have to be lower or equal to sample count!" << endl;
|
|||
|
return 1;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// create algorithm
|
|||
|
Ptr<PCTSignatures> pctSignatures = PCTSignatures::create(initSampleCount, initSeedCount, PCTSignatures::UNIFORM);
|
|||
|
pctSignatures->setGrayscaleBits(grayscaleBitsPerPixel);
|
|||
|
|
|||
|
// open video capture device
|
|||
|
VideoCapture videoCapture;
|
|||
|
if (!videoCapture.open(0))
|
|||
|
{
|
|||
|
cerr << "Unable to open the first video capture device with ID = 0!" << endl;
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
// Create windows for display.
|
|||
|
namedWindow("Source", WINDOW_AUTOSIZE);
|
|||
|
namedWindow("Result", WINDOW_AUTOSIZE);
|
|||
|
|
|||
|
// run drawing loop
|
|||
|
for (;;)
|
|||
|
{
|
|||
|
videoCapture >> frame;
|
|||
|
if (frame.empty()) break; // end of video stream
|
|||
|
|
|||
|
pctSignatures->computeSignature(frame, signature);
|
|||
|
PCTSignatures::drawSignature(Mat::zeros(frame.size(), frame.type()), signature, result);
|
|||
|
|
|||
|
imshow("Source", frame); // Show our images inside the windows.
|
|||
|
imshow("Result", result);
|
|||
|
|
|||
|
if (waitKey(1) == 27) break; // stop videocapturing by pressing ESC
|
|||
|
}
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|