32#include <opencv2/opencv.hpp>
34#include "Image/ByteImage.h"
35#include "Image/ImageProcessor.h"
36#include "Image/IplImageAdaptor.h"
49 const int cornersPerColumn =
getProperty<int>(
"NumberOfColumns").getValue() - 1;
50 const int cornersPerImage = cornersPerColumn * cornersPerRow;
53 m_pCorners2DFloat =
new CvPoint2D32f[cornersPerImage];
54 m_pCorners2D =
new CvPoint2D64f[cornersPerImage];
55 m_pCorners3D =
new CvPoint3D64f[cornersPerImage];
57 waitingIntervalBetweenImages =
getProperty<int>(
"WaitingIntervalBetweenImages").getValue();
60 numberOfCapturedImages = 0;
64 ARMARX_INFO <<
"Calibration pattern with " << cornersPerColumn + 1 <<
" x "
65 << cornersPerRow + 1 <<
" squares of size " << squareSize;
66 double etalonParams[3] = {
67 double(cornersPerColumn + 1), double(cornersPerRow + 1), squareSize};
68 m_pCalibFilter->SetCameraCount(2);
69 m_pCalibFilter->SetFrames(desiredNumberOfImages);
81 cameraImages =
new CByteImage*[2];
85 startingTime = IceUtil::Time::now();
86 timeOfLastCapture = IceUtil::Time::now();
99 delete cameraImages[0];
100 delete cameraImages[1];
101 delete[] cameraImages;
102 delete m_pCalibFilter;
103 delete[] m_pCorners3D;
104 delete[] m_pCorners2D;
105 delete[] m_pCorners2DFloat;
111 long timeSinceStart = (IceUtil::Time::now() - startingTime).toMilliSeconds();
113 if (timeSinceStart < 10000)
115 ARMARX_VERBOSE <<
"Time until start of capture: " << timeSinceStart - 10000 <<
" ms";
127 int nNumberImages =
getImages(cameraImages);
130 if ((IceUtil::Time::now() - timeOfLastCapture).toMilliSeconds() >
131 waitingIntervalBetweenImages)
133 ARMARX_INFO <<
"Capturing image " << numberOfCapturedImages + 1 <<
" of "
134 << desiredNumberOfImages;
135 IplImage* ppIplImages[2] = {IplImageAdaptor::Adapt(cameraImages[0]),
136 IplImageAdaptor::Adapt(cameraImages[1])};
138 if (m_pCalibFilter->FindEtalon(ppIplImages))
141 numberOfCapturedImages++;
142 m_pCalibFilter->DrawPoints(ppIplImages);
143 m_pCalibFilter->Push();
144 timeOfLastCapture = IceUtil::Time::now();
146 if (numberOfCapturedImages == desiredNumberOfImages)
150 if (m_pCalibFilter->IsCalibrated())
152 ARMARX_INFO <<
"Saving camera calibration to file "
153 << m_sCameraParameterFileName;
154 m_pCalibFilter->SaveCameraParams(
155 m_sCameraParameterFileName.c_str());
@ CV_CALIB_ETALON_CHESSBOARD
Property< PropertyType > getProperty(const std::string &name)
std::string getName() const
Retrieve name of object.
Ice::ObjectPrx getProxy(long timeoutMs=0, bool waitForScheduler=true) const
Returns the proxy of this object (optionally it waits for the proxy)
void onConnectImageProcessor() override
Implement this method in the ImageProcessor in order execute parts when the component is fully initia...
void onExitImageProcessor() override
Exit the ImapeProcessor component.
void process() override
Process the vision component.
void onInitImageProcessor() override
Setup the vision component.
void enableResultImages(int numberImages, ImageDimension imageDimension, ImageType imageType, const std::string &name="")
Enables visualization.
void usingImageProvider(std::string name)
Registers a delayed topic subscription and a delayed provider proxy retrieval which all will be avail...
bool waitForImages(int milliseconds=1000)
Wait for new images.
ImageProviderInfo getImageProvider(std::string name, ImageType destinationImageType=eRgb, bool waitForProxy=false)
Select an ImageProvider.
int getImages(CByteImage **ppImages)
Poll images from provider.
void provideResultImages(CByteImage **images, armarx::MetaInfoSizeBasePtr info=nullptr)
sends result images for visualization
ImageFormatInfo imageFormat
Image format struct that contains all necessary image information.
#define ARMARX_INFO
The normal logging level.
#define ARMARX_IMPORTANT
The logging level for always important information, but expected behaviour (in contrast to ARMARX_WAR...
#define ARMARX_WARNING
The logging level for unexpected behaviour, but not a serious problem.
#define ARMARX_VERBOSE
The logging level for verbose information.