123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- /*M///////////////////////////////////////////////////////////////////////////////////////
- //
- // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
- //
- // 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
- //
- // Copyright (C) 2015, OpenCV Foundation, 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:
- //
- // * Redistribution's of source code must retain the above copyright notice,
- // this list of conditions and the following disclaimer.
- //
- // * Redistribution's 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.
- //
- // * The name of the copyright holders may not 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 the Intel Corporation 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.
- //
- //M*/
- #include <opencv2/imgproc.hpp>
- #include <opencv2/highgui.hpp>
- #include <opencv2/structured_light.hpp>
- #include <iostream>
- #include <stdio.h>
- using namespace cv;
- using namespace std;
- static const char* keys =
- { "{@path | | Path of the folder where the captured pattern images will be save }"
- "{@proj_width | | Projector width }"
- "{@proj_height | | Projector height }" };
- static void help()
- {
- cout << "\nThis example shows how to use the \"Structured Light module\" to acquire a graycode pattern"
- "\nCall (with the two cams connected):\n"
- "./example_structured_light_cap_pattern <path> <proj_width> <proj_height> \n"
- << endl;
- }
- int main( int argc, char** argv )
- {
- structured_light::GrayCodePattern::Params params;
- CommandLineParser parser( argc, argv, keys );
- String path = parser.get<String>( 0 );
- params.width = parser.get<int>( 1 );
- params.height = parser.get<int>( 2 );
- if( path.empty() || params.width < 1 || params.height < 1 )
- {
- help();
- return -1;
- }
- // Set up GraycodePattern with params
- Ptr<structured_light::GrayCodePattern> graycode = structured_light::GrayCodePattern::create( params );
- // Storage for pattern
- vector<Mat> pattern;
- graycode->generate( pattern );
- cout << pattern.size() << " pattern images + 2 images for shadows mask computation to acquire with both cameras"
- << endl;
- // Generate the all-white and all-black images needed for shadows mask computation
- Mat white;
- Mat black;
- graycode->getImagesForShadowMasks( black, white );
- pattern.push_back( white );
- pattern.push_back( black );
- // Setting pattern window on second monitor (the projector's one)
- namedWindow( "Pattern Window", WINDOW_NORMAL );
- resizeWindow( "Pattern Window", params.width, params.height );
- moveWindow( "Pattern Window", params.width + 316, -20 );
- setWindowProperty( "Pattern Window", WND_PROP_FULLSCREEN, WINDOW_FULLSCREEN );
- // Open camera number 1, using libgphoto2
- VideoCapture cap1( CAP_GPHOTO2 );
- if( !cap1.isOpened() )
- {
- // check if cam1 opened
- cout << "cam1 not opened!" << endl;
- help();
- return -1;
- }
- // Open camera number 2
- VideoCapture cap2( 1 );
- if( !cap2.isOpened() )
- {
- // check if cam2 opened
- cout << "cam2 not opened!" << endl;
- help();
- return -1;
- }
- // Turning off autofocus
- cap1.set( CAP_PROP_SETTINGS, 1 );
- cap2.set( CAP_PROP_SETTINGS, 1 );
- int i = 0;
- while( i < (int) pattern.size() )
- {
- cout << "Waiting to save image number " << i + 1 << endl << "Press any key to acquire the photo" << endl;
- imshow( "Pattern Window", pattern[i] );
- Mat frame1;
- Mat frame2;
- cap1 >> frame1; // get a new frame from camera 1
- cap2 >> frame2; // get a new frame from camera 2
- if( ( frame1.data ) && ( frame2.data ) )
- {
- Mat tmp;
- cout << "cam 1 size: " << Size( ( int ) cap1.get( CAP_PROP_FRAME_WIDTH ), ( int ) cap1.get( CAP_PROP_FRAME_HEIGHT ) )
- << endl;
- cout << "cam 2 size: " << Size( ( int ) cap2.get( CAP_PROP_FRAME_WIDTH ), ( int ) cap2.get( CAP_PROP_FRAME_HEIGHT ) )
- << endl;
- cout << "zoom cam 1: " << cap1.get( CAP_PROP_ZOOM ) << endl << "zoom cam 2: " << cap2.get( CAP_PROP_ZOOM )
- << endl;
- cout << "focus cam 1: " << cap1.get( CAP_PROP_FOCUS ) << endl << "focus cam 2: " << cap2.get( CAP_PROP_FOCUS )
- << endl;
- cout << "Press enter to save the photo or an other key to re-acquire the photo" << endl;
- namedWindow( "cam1", WINDOW_NORMAL );
- resizeWindow( "cam1", 640, 480 );
- namedWindow( "cam2", WINDOW_NORMAL );
- resizeWindow( "cam2", 640, 480 );
- // Moving window of cam2 to see the image at the same time with cam1
- moveWindow( "cam2", 640 + 75, 0 );
- // Resizing images to avoid issues for high resolution images, visualizing them as grayscale
- resize( frame1, tmp, Size( 640, 480 ), 0, 0, INTER_LINEAR_EXACT);
- cvtColor( tmp, tmp, COLOR_RGB2GRAY );
- imshow( "cam1", tmp );
- resize( frame2, tmp, Size( 640, 480 ), 0, 0, INTER_LINEAR_EXACT);
- cvtColor( tmp, tmp, COLOR_RGB2GRAY );
- imshow( "cam2", tmp );
- bool save1 = false;
- bool save2 = false;
- int key = waitKey( 0 );
- // Pressing enter, it saves the output
- if( key == 13 )
- {
- ostringstream name;
- name << i + 1;
- save1 = imwrite( path + "pattern_cam1_im" + name.str() + ".png", frame1 );
- save2 = imwrite( path + "pattern_cam2_im" + name.str() + ".png", frame2 );
- if( ( save1 ) && ( save2 ) )
- {
- cout << "pattern cam1 and cam2 images number " << i + 1 << " saved" << endl << endl;
- i++;
- }
- else
- {
- cout << "pattern cam1 and cam2 images number " << i + 1 << " NOT saved" << endl << endl << "Retry, check the path"<< endl << endl;
- }
- }
- // Pressing escape, the program closes
- if( key == 27 )
- {
- cout << "Closing program" << endl;
- }
- }
- else
- {
- cout << "No frame data, waiting for new frame" << endl;
- }
- }
- // the camera will be deinitialized automatically in VideoCapture destructor
- return 0;
- }
|