39 providerName = getProperty<std::string>(
"providerName").getValue();
40 usingImageProvider(providerName);
42 offeringTopic(getProperty<std::string>(
"TrackingErrorTopicName").getValue());
44 offeringTopic(getProperty<std::string>(
"DebugObserverName").getValue());
46 frameRate = getProperty<float>(
"Framerate").getValue();
48 useChessboard = getProperty<bool>(
"UseChessBoard").getValue();
50 chessboardWidth = getProperty<int>(
"Chessboard.Width").getValue();
51 chessboardHeight = getProperty<int>(
"Chessboard.Height").getValue();
57 std::unique_lock lock(imageMutex);
60 imageProviderPrx = getProxy<visionx::ImageProviderInterfacePrx>(providerName);
62 cameraImages =
new CByteImage*[2];
67 debugObserver = getTopic<DebugObserverInterfacePrx>(
68 getProperty<std::string>(
"DebugObserverName").getValue());
70 prx = getTopic<TrackingErrorListenerPrx>(
71 getProperty<std::string>(
"TrackingErrorTopicName").getValue());
73 imageWidth = imageProviderPrx->getImageFormat().dimension.width;
74 imageHeight = imageProviderPrx->getImageFormat().dimension.height;
77 1, imageProviderPrx->getImageFormat().dimension, imageProviderPrx->getImageFormat().type);
88 std::unique_lock lock(imageMutex);
90 if (!waitForImages(getProperty<std::string>(
"providerName").getValue(), 1000))
92 ARMARX_WARNING <<
"Timeout while waiting for camera images (>1000ms)";
96 int numImages = getImages(cameraImages);
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])};
174 provideResultImages(resultImages);
178 fpsCounter.assureFPS(frameRate);