40 ImageProcessingThread::ImageProcessingThread(
41 TrackingSystem &trackingSystem, ImageSource &cam,
42 TrackerThread &trackerThread, CameraParameters
const &camParams,
43 std::int32_t cameraUsecOffset)
44 : trackingSystem_(trackingSystem), cam_(cam),
45 trackerThreadObj_(trackerThread), camParams_(camParams),
46 cameraUsecOffset_(cameraUsecOffset),
47 logBlobs_(trackingSystem_.getParams().logRawBlobs) {
49 blobFile_.open(
"blobs.csv");
51 blobFile_ <<
"sec,usec,x,y,size" << std::endl;
53 warn() <<
"Could not open blob file!" << std::endl;
61 std::lock_guard<std::mutex> lock{stateMutex_};
62 next_ = NextOp::DoFrame;
64 stateCondVar_.notify_all();
69 std::lock_guard<std::mutex> lock{stateMutex_};
72 stateCondVar_.notify_all();
78 std::unique_lock<std::mutex> lock(stateMutex_);
80 if (NextOp::Waiting == next_) {
83 lock, [&] {
return next_ != NextOp::Waiting; });
87 if (NextOp::Exit == next_) {
94 next_ = NextOp::Waiting;
100 void ImageProcessingThread::doFrame() {
101 ImageOutputDataPtr data;
111 cam_.
retrieve(frame_, gray_, frameTime);
112 if (!frame_.data || !gray_.data) {
123 if (cameraUsecOffset_ != 0) {
131 data = trackingSystem_.performInitialImageProcessing(frameTime, frame_,
140 blobFile_ << data->tv.seconds <<
"," << data->tv.microseconds;
141 for (
auto &measurement : data->ledMeasurements) {
142 blobFile_ <<
"," << measurement.loc.x <<
","
143 << measurement.loc.y <<
"," << measurement.diameter;
152 std::ostream &ImageProcessingThread::msg()
const {
153 return std::cout <<
"[UnifiedTracker:ImgProcThread] ";
156 std::ostream &ImageProcessingThread::warn()
const {
157 return msg() <<
"Warning: ";
Header declaring a C++11 finally or "scope-guard" construct.
void threadAction()
Entry point for the thread dedicated to this object.
void signalExit()
called by TrackerThread
::OSVR_TimeValue TimeValue
C++-friendly typedef for the OSVR_TimeValue structure.
void signalDoFrame()
called by TrackerThread
FinalTask< F > finally(F &&f)
virtual void retrieve(cv::Mat &color, cv::Mat &gray, osvr::util::time::TimeValue ×tamp)
Call after grab() to get the actual image data.
Standardized, portable parallel to struct timeval for representing both absolute times and time inter...
void osvrTimeValueSum(OSVR_TimeValue *tvA, const OSVR_TimeValue *tvB)
Sums two time values, replacing the first with the result.
void signalImageProcessingComplete(ImageOutputDataPtr &&imageData, cv::Mat const &frame, cv::Mat const &frameGray)