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<37>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;
|
||
}
|