Skip to content

Commit 738d027

Browse files
committed
Improve command line parsing and fast grabbing
1 parent 06778f3 commit 738d027

6 files changed

+29
-49
lines changed

src/ArgumentsParser.cpp

+10-12
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* @version 1.0
66
* @author Daniel Konecny (xkonec75)
77
* @organisation Brno University of Technology - Faculty of Information Technologies
8-
* @date 02. 04. 2021
8+
* @date 03. 04. 2021
99
*/
1010

1111

@@ -41,20 +41,19 @@ long long ArgumentsParser::LoadNumber(char* numberAsChars) {
4141
return numberAsInt;
4242
}
4343

44-
4544
void ArgumentsParser::PrintHelp () {
46-
cout << "-v (verbose) Print information about the camera state." << endl <<
47-
"-n (number) Set number of images to be taken by each camera." << endl <<
45+
cout << "IMAGE GRABBER" << endl <<
46+
"-v (verbose) Print information about the camera state." << endl <<
47+
"-t (time) Set time (in ms) between images grabbed." << endl <<
4848
"-h (help) Show help." << endl;
4949
}
5050

51-
5251
bool ArgumentsParser::ProcessArguments (int argc, char* argv[]) {
53-
const char* const short_opts = "vn:h";
52+
const char* const short_opts = "vt:h";
5453

5554
const option long_opts[] = {
5655
{"verbose", no_argument, nullptr, 'v'},
57-
{"number", required_argument, nullptr, 'n'},
56+
{"time", required_argument, nullptr, 't'},
5857
{"help", no_argument, nullptr, 'h'},
5958
{nullptr, no_argument, nullptr, 0}
6059
};
@@ -71,9 +70,9 @@ bool ArgumentsParser::ProcessArguments (int argc, char* argv[]) {
7170
verbose = true;
7271
break;
7372

74-
case 'n':
73+
case 't':
7574
try {
76-
imageCount = (unsigned long long)LoadNumber(optarg);
75+
waitTime = (unsigned long long)LoadNumber(optarg);
7776
}
7877
catch (...) {
7978
return false;
@@ -95,7 +94,6 @@ bool ArgumentsParser::IsVerbose() {
9594
return verbose;
9695
}
9796

98-
99-
unsigned long long int ArgumentsParser::GetImageCount () {
100-
return imageCount;
97+
unsigned long long int ArgumentsParser::GetWaitTime () {
98+
return waitTime;
10199
}

src/ArgumentsParser.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55
* @version 1.0
66
* @author Daniel Konecny (xkonec75)
77
* @organisation Brno University of Technology - Faculty of Information Technologies
8-
* @date 02. 04. 2021
8+
* @date 03. 04. 2021
99
*/
1010

1111
class ArgumentsParser {
1212
private:
1313
bool verbose = false;
14-
unsigned long long int imageCount = 0;
14+
unsigned long long int waitTime = 10;
1515

1616
void PrintHelp ();
1717

@@ -22,5 +22,5 @@ class ArgumentsParser {
2222

2323
bool IsVerbose();
2424

25-
unsigned long long int GetImageCount ();
25+
unsigned long long int GetWaitTime ();
2626
};

src/ImageEventHandler.cpp

+7-3
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ using namespace Pylon;
2424
using namespace cv;
2525

2626

27-
ImageEventHandler::ImageEventHandler () {
27+
ImageEventHandler::ImageEventHandler (bool inputVerbose) {
2828
timestampFile.open("out/timestamps.csv");
2929
timestampFile << "\"image_file\",\"timestamp_in_ms\",\"iso_datetime\"\n";
3030

@@ -36,6 +36,8 @@ ImageEventHandler::ImageEventHandler () {
3636
formatConverter.OutputPixelFormat = PixelType_BGR8packed;
3737

3838
timeOffset = 0;
39+
40+
verbose = inputVerbose;
3941
}
4042

4143
ImageEventHandler::~ImageEventHandler () {
@@ -92,10 +94,12 @@ void ImageEventHandler::OnImageGrabbed (
9294
// Write info to CSV file.
9395
timestampFile << "\"" << imgNameString << "\"," << timestamp
9496
<< ",\"" << datetimeString << "\"\n";
95-
cout << "Grabbed image " << imgNameString << " at " << datetimeString << endl;
97+
if (verbose) {
98+
cout << "Grabbed image " << imgNameString << " at " << datetimeString << endl;
99+
}
96100
}
97101
else {
98-
cout << "Error: " << std::hex << ptrGrabResult->GetErrorCode()
102+
cerr << "Error: " << std::hex << ptrGrabResult->GetErrorCode()
99103
<< std::dec << " " << ptrGrabResult->GetErrorDescription() << endl;
100104
}
101105
}

src/ImageEventHandler.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,10 @@ class ImageEventHandler : public CBaslerUniversalImageEventHandler {
2525
unsigned long long int timeOffset;
2626
CPylonImage imgPylon;
2727
CImageFormatConverter formatConverter;
28+
bool verbose;
2829

2930
public:
30-
ImageEventHandler ();
31+
ImageEventHandler (bool inputVerbose);
3132

3233
~ImageEventHandler ();
3334

src/ImageGrabber.cpp

+5-28
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
* Image Grabber
33
* Application for grabbing images from Basler cameras using Pylon API.
44
* @file ImageGrabber.cpp
5-
* @version 1.0
5+
* @version 2.0
66
* @author Daniel Konecny (xkonec75)
77
* @organisation Brno University of Technology - Faculty of Information Technologies
8-
* @date 02. 04. 2021
8+
* @date 03. 04. 2021
99
*/
1010

1111
#include <iostream>
@@ -47,7 +47,7 @@ ImageGrabber::ImageGrabber (ArgumentsParser parser) {
4747
new CSoftwareTriggerConfiguration, RegistrationMode_ReplaceAll, Cleanup_Delete);
4848

4949
cameras[cameraIndex].RegisterImageEventHandler(
50-
new ImageEventHandler, RegistrationMode_Append, Cleanup_Delete);
50+
new ImageEventHandler(parser.IsVerbose()), RegistrationMode_Append, Cleanup_Delete);
5151

5252
if (parser.IsVerbose()) {
5353
cout << "Using device " << cameras[cameraIndex].GetDeviceInfo().GetModelName() << endl;
@@ -66,13 +66,11 @@ ImageGrabber::ImageGrabber (ArgumentsParser parser) {
6666
// Enable time stamp chunks.
6767
cameras[cameraIndex].ChunkSelector.SetValue(Basler_UniversalCameraParams::ChunkSelector_Timestamp);
6868
cameras[cameraIndex].ChunkEnable.SetValue(true);
69-
70-
cout << cameras[cameraIndex].ResultingFrameRate.GetValue() << endl;
7169
}
7270
}
7371

7472
void ImageGrabber::Grab (ArgumentsParser parser) {
75-
size_t imagesToTake = parser.GetImageCount();
73+
int waitTime = parser.GetWaitTime();
7674

7775
cameras.StartGrabbing(GrabStrategy_OneByOne, GrabLoop_ProvidedByInstantCamera);
7876

@@ -81,28 +79,7 @@ void ImageGrabber::Grab (ArgumentsParser parser) {
8179
cameras[cameraIndex].WaitForFrameTriggerReady(100, TimeoutHandling_ThrowException);
8280
cameras[cameraIndex].ExecuteSoftwareTrigger();
8381
}
84-
this_thread::sleep_for(chrono::milliseconds(10));
85-
86-
87-
/*
88-
// One possible sequential implementation of capturing images from two cameras.
89-
if (cameraCount == 2) {
90-
if (cameras[0].WaitForFrameTriggerReady(1000, TimeoutHandling_ThrowException)) {
91-
cameras[0].ExecuteSoftwareTrigger();
92-
}
93-
if (cameras[1].WaitForFrameTriggerReady(1000, TimeoutHandling_ThrowException)) {
94-
cameras[1].ExecuteSoftwareTrigger();
95-
}
96-
}
97-
else if (cameraCount == 1) {
98-
if (cameras[0].WaitForFrameTriggerReady(1000, TimeoutHandling_ThrowException)) {
99-
cameras[0].ExecuteSoftwareTrigger();
100-
}
101-
}
102-
else {
103-
cerr << "Camera count " << cameraCount << " is not implemented." << endl;
104-
}
105-
*/
82+
this_thread::sleep_for(chrono::milliseconds(waitTime));
10683
}
10784
}
10885

src/main.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
* Image Grabber
33
* Application for grabbing images from Basler cameras using Pylon API.
44
* @file main.cpp
5-
* @version 1.0
5+
* @version 2.0
66
* @author Daniel Konecny (xkonec75)
77
* @organisation Brno University of Technology - Faculty of Information Technologies
8-
* @date 02. 04. 2021
8+
* @date 03. 04. 2021
99
*/
1010

1111
#include <iostream>

0 commit comments

Comments
 (0)