88 std::unique_lock lock(imageMutex);
92 ARMARX_WARNING <<
"Timeout while waiting for camera images (>1000ms)";
104 IplImage* ppIplImages[1] = {IplImageAdaptor::Adapt(cameraImages[0])};
108 cv::Mat resultImage = cv::cvarrToMat(ppIplImages[0]);
109 cv::cvtColor(resultImage, grayImage, cv::COLOR_BGR2GRAY);
111 std::vector<cv::Point2f> features;
113 cv::Size size = cv::Size(chessboardWidth, chessboardHeight);
119 bool foundCorners = cv::findChessboardCorners(
120 grayImage, size, features, cv::CALIB_CB_ADAPTIVE_THRESH + cv::CALIB_CB_NORMALIZE_IMAGE);
124 float avgX = 0.f, avgY = 0.f;
125 for (cv::Point2f point : features)
130 avgX /= features.size();
131 avgY /= features.size();
133 cv::Point2f imgCenter(imageWidth / 2, imageHeight / 2);
134 cv::Point2f chessboardCenter(avgX, avgY);
135 cv::Point2f point(avgX, imageHeight / 2);
136 cv::circle(resultImage, chessboardCenter, 2, CV_RGB(255, 0, 0), -1);
137 cv::circle(resultImage, imgCenter, 2, CV_RGB(255, 0, 0), -1);
138 cv::line(resultImage, chessboardCenter, imgCenter, CV_RGB(0, 0, 255), 1);
139 cv::line(resultImage, chessboardCenter, point, CV_RGB(0, 255, 0), 1);
140 cv::line(resultImage, imgCenter, point, CV_RGB(0, 255, 0), 1);
142 float trackingErrorX = avgX - (imageWidth / 2);
143 float trackingErrorY = avgY - (imageHeight / 2);
145 float angleX = (trackingErrorX / imageWidth) * 59.7;
146 float angleY = (trackingErrorY / imageHeight) * 44.775;
150 debugValues[
"trackingErrorX"] =
new Variant(trackingErrorX);
151 debugValues[
"trackingErrorY"] =
new Variant(trackingErrorY);
152 debugValues[
"angleX"] =
new Variant(angleX);
153 debugValues[
"angleY"] =
new Variant(angleY);
156 debugObserver->setDebugChannel(
"TrackingError", debugValues);
159 prx->reportNewTrackingError(trackingErrorX, trackingErrorY, angleX, angleY);
173 CByteImage* resultImages[1] = {IplImageAdaptor::Adapt(ppIplImages[0])};
178 fpsCounter.assureFPS(frameRate);