Skip to content
This repository has been archived by the owner on Apr 2, 2024. It is now read-only.

Commit

Permalink
* Added frequency
Browse files Browse the repository at this point in the history
Signed-off-by: Christian Berger <christian.berger@gu.se>
  • Loading branch information
chrberger committed Apr 23, 2018
1 parent 1977fc8 commit 2c45c56
Showing 1 changed file with 42 additions and 35 deletions.
77 changes: 42 additions & 35 deletions src/opendlv-device-camera-opencv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,13 @@
int32_t main(int32_t argc, char **argv) {
int32_t retCode{0};
auto commandlineArguments = cluon::getCommandlineArguments(argc, argv);
if ( (0 == commandlineArguments.count("camera")) || (0 == commandlineArguments.count("cid")) || (0 == commandlineArguments.count("width")) || (0 == commandlineArguments.count("height")) || (0 == commandlineArguments.count("bpp")) ) {
if ( (0 == commandlineArguments.count("camera")) || (0 == commandlineArguments.count("cid")) || (0 == commandlineArguments.count("width")) || (0 == commandlineArguments.count("height")) || (0 == commandlineArguments.count("bpp")) || (0 == commandlineArguments.count("freq")) ) {
std::cerr << argv[0] << " interfaces with the given V4L camera id (i.e., 0 for /dev/video0 or a valid connection string) and publishes it to a running OpenDaVINCI session using the OpenDLV Standard Message Set." << std::endl;
std::cerr << "Usage: " << argv[0] << " --camera=<V4L id> --cid=<OpenDaVINCI session> --width=<width> --height=<height> --bpp=<bits per pixel> [--name=<unique name for the associated shared memory>] [--id=<Identifier in case of multiple cameras>] [--verbose]" << std::endl;
std::cerr << " --freq: desired bits per pixel of a frame (must be either 8 or 24)" << std::endl;
std::cerr << " --width: desired width of a frame" << std::endl;
std::cerr << " --height: desired height of a frame" << std::endl;
std::cerr << " --bpp: desired bits per pixel of a frame (either 8 or 24)" << std::endl;
std::cerr << " --bpp: desired bits per pixel of a frame (must be either 8 or 24)" << std::endl;
std::cerr << " --name: when omitted, '/cam0' is chosen" << std::endl;
std::cerr << " --verbose: when set, the raw image is displayed" << std::endl;
std::cerr << "Example: " << argv[0] << " --cid=111 --camera=/dev/video0 --name=cam0" << std::endl;
Expand All @@ -55,54 +56,60 @@ int32_t main(int32_t argc, char **argv) {
const uint32_t WIDTH{static_cast<uint32_t>(std::stoi(commandlineArguments["width"]))};
const uint32_t HEIGHT{static_cast<uint32_t>(std::stoi(commandlineArguments["height"]))};
const uint32_t BPP{static_cast<uint32_t>(std::stoi(commandlineArguments["bpp"]))};
const float FREQ{static_cast<float>(std::stof(commandlineArguments["freq"]))};

if ( (BPP != 24) && (BPP != 8) ) {
std::cerr << argv[0] << ": bits per pixel must be either 24 or 8; found " << BPP << "." << std::endl;
return retCode = 1;
}
else {
const uint32_t SIZE{WIDTH * HEIGHT * BPP/8};
const std::string NAME{(commandlineArguments["name"].size() != 0) ? commandlineArguments["name"] : "/cam0"};
const uint32_t ID{(commandlineArguments["id"].size() != 0) ? static_cast<uint32_t>(std::stoi(commandlineArguments["id"])) : 0};
const bool VERBOSE{commandlineArguments.count("verbose") != 0};
if ( !(FREQ > 0) ) {
std::cerr << argv[0] << ": freq must be larger than 0; found " << FREQ << "." << std::endl;
return retCode = 1;
}
const uint32_t SIZE{WIDTH * HEIGHT * BPP/8};
const std::string NAME{(commandlineArguments["name"].size() != 0) ? commandlineArguments["name"] : "/cam0"};
const uint32_t ID{(commandlineArguments["id"].size() != 0) ? static_cast<uint32_t>(std::stoi(commandlineArguments["id"])) : 0};
const bool VERBOSE{commandlineArguments.count("verbose") != 0};

(void)ID;
(void)ID;

if (videoStream && videoStream->isOpened()) {
videoStream->set(CV_CAP_PROP_FRAME_WIDTH, WIDTH);
videoStream->set(CV_CAP_PROP_FRAME_HEIGHT, HEIGHT);
videoStream->set(CV_CAP_PROP_FORMAT, (BPP == 24 ? CV_CAP_MODE_RGB : CV_CAP_MODE_GRAY));
if (videoStream && videoStream->isOpened()) {
videoStream->set(CV_CAP_PROP_FRAME_WIDTH, WIDTH);
videoStream->set(CV_CAP_PROP_FRAME_HEIGHT, HEIGHT);
videoStream->set(CV_CAP_PROP_FORMAT, (BPP == 24 ? CV_CAP_MODE_RGB : CV_CAP_MODE_GRAY));

// Interface to a running OpenDaVINCI session (ignoring any incoming Envelopes).
cluon::OD4Session od4{static_cast<uint16_t>(std::stoi(commandlineArguments["cid"]))};
// Interface to a running OpenDaVINCI session (ignoring any incoming Envelopes).
cluon::OD4Session od4{static_cast<uint16_t>(std::stoi(commandlineArguments["cid"]))};

std::unique_ptr<cluon::SharedMemory> sharedMemory(new cluon::SharedMemory{NAME, SIZE});
if (sharedMemory && sharedMemory->valid()) {
std::clog << argv[0] << ": Data from camera '" << commandlineArguments["camera"]<< "' available in shared memory '" << sharedMemory->name() << "' (" << sharedMemory->size() << ")." << std::endl;
std::unique_ptr<cluon::SharedMemory> sharedMemory(new cluon::SharedMemory{NAME, SIZE});
if (sharedMemory && sharedMemory->valid()) {
std::clog << argv[0] << ": Data from camera '" << commandlineArguments["camera"]<< "' available in shared memory '" << sharedMemory->name() << "' (" << sharedMemory->size() << ")." << std::endl;

auto timeTrigger = [&videoStream, &sharedMemory, &VERBOSE](){
cv::Mat frameData;
bool retVal{true};
while (retVal && od4.isRunning()) {
retVal = videoStream->read(frameData);
if (retVal) {
sharedMemory->lock();
::memcpy(sharedMemory->data(), reinterpret_cast<char*>(frameData.data), frameData.step * frameData.rows);
sharedMemory->unlock();
sharedMemory->notifyAll();
}
if (retVal && VERBOSE) {
cv::imshow(sharedMemory->name(), frameData);
}
cv::waitKey(10);
bool retVal = videoStream->read(frameData);
if (retVal) {
sharedMemory->lock();
::memcpy(sharedMemory->data(), reinterpret_cast<char*>(frameData.data), frameData.step * frameData.rows);
sharedMemory->unlock();
sharedMemory->notifyAll();
}
if (retVal && VERBOSE) {
cv::imshow(sharedMemory->name(), frameData);
}
}
else {
std::cerr << argv[0] << ": Failed to create shared memory '" << NAME << "'." << std::endl;
}
cv::waitKey(10);
return retVal;
};

od4.timeTrigger(FREQ, timeTrigger);
}
else {
std::cerr << argv[0] << ": Failed to open camera '" << commandlineArguments["camera"] << "'." << std::endl;
std::cerr << argv[0] << ": Failed to create shared memory '" << NAME << "'." << std::endl;
}
}
else {
std::cerr << argv[0] << ": Failed to open camera '" << commandlineArguments["camera"] << "'." << std::endl;
}
}
return retCode;
}
Expand Down

0 comments on commit 2c45c56

Please sign in to comment.