Ask Your Question

Alexander Shishkov's profile - activity

2016-01-01 12:22:27 -0500 received badge  Nice Answer (source)
2011-03-25 06:29:47 -0500 received badge  Nice Answer (source)
2011-03-24 02:38:59 -0500 commented answer Pose (rvec, tvec) from Opencv
But apparently you are right in the case of the Kinect. Here ( Suat Gedikli wrote that in ROS points are in meters.
2011-03-24 02:36:00 -0500 commented answer Pose (rvec, tvec) from Opencv
I know that openni depthmap gives back coordinates for each pixel in mm. But I don't know which way ros wrapper for openni changes this coords. Maybe you find some useful information here:
2011-03-24 01:51:35 -0500 answered a question Pose (rvec, tvec) from Opencv

As an example in tod_detecting we end up with a candidate object pose inside an ObjectInfo object. The output of object.tvec is as follows, tvec = [-0.0661444212290265; -0.0178236515058925; 0.01091917408303104]. So it means the object coordinate frame is moved -6 CM in x direction, -1 CM in y direction and 1 CM in z direction with respect to what? Where this translation will get me from object origin to WHICH coordinate frame's ORIGIN?

Guess contains rvec and tvec transformed some 3d points from abstract coordinate system (that set by fidycial.yaml config and rigidly attached to fidycial markers) to the coordinate system rigidly attached to test camera. It is not in centimeters. Scale of 3d translation depends on calibration parameters of your device. I don't know what is it in the case of the Kinect.

But in terms of camera coordinate system or chessboard coordinate system?

In terms of camera coordinate system.

2011-03-24 00:54:01 -0500 commented answer Does tod_training in object_recognition require fiducial markers on training images?
I don't know. Ethan supports this wiki page. I like more the earlier version.
2011-03-23 13:32:17 -0500 answered a question Pose (rvec, tvec) from Opencv

In tod_detecting (I think we tell about this transformation) after running recognizer->match you get vector of guesses. Each guess contains PoseRT (rvec, tvec) field (aligned_pose). It is transformation from some abstract coordinate system (defined by fiducial.yaml configuration file: in this system coordinates of corners of fiducial markers must be equals described ones in config) to coordinate system of camera for test image. If you want to find projection of this guess to the test image, you should take any observation of this object from training base(recommend to choose observation with ImageId equals imageIndex from guess->imageIndices). Next you should transform 3d points related with the observation to the abstract coord. system using inverse features3d->camera->pose transformation (for example with using Tools::invert and project3dPoints). Then you should transform obtained 3d points with guess->aligned_pose and project them to the test image (for this purpose you should know intrinsics parameters of the camera, now we assume, that test and train images was photographed with the same camera; we use projectPoints function for this purpose).

Let consider a case of solvePnP or solvePnPRansac:

void solvePnP(const Mat& objectPoints, const Mat& imagePoints, const Mat& cameraMatrix, const Mat& distCoeffs, Mat& rvec, Mat& tvec, bool useExtrinsicGuess=false)

The function returns rvec and tvec. This transformation converts objectPoints to the coordinate system of the camera such a way, that re-projection error between imagePoints and projected points after transformation would be a minimal. In other words we try to find rvec-tvec pair to minimize distance between projection (u, v) of transformed point (x,y,z) calculated on (X,Y,Z) point from objectPoints and corresponding point (x, y) from imagePoints. ki and pi are from distCoeffs, fx, fy, cx, cy are from cameraMatrix.

See attached image: image description

2011-03-23 07:59:59 -0500 answered a question Purpose of pose estimations in tod_detecting?

I don't understand first part of your question. We do pose estimation in training for calculation transformation between frames.

mode = xx

Now tod_detecting contains two recognizers. First version of TOD (textured_object_detection package) was implemented for recognizing objects on 5 MP prosilica dataset. Later Ethan and me began to refactor this code. In result we get two versions of detection algorithms: Kinect mode and TOD mode. Kinect mode gives better results on Kinect data, TOD mode gives better results on 5MP data.

2011-03-23 07:42:59 -0500 received badge  Teacher (source)
2011-03-23 05:14:45 -0500 received badge  Editor (source)
2011-03-23 05:13:53 -0500 answered a question Physical setup for collecting tod_training data?

We need fiducial markers rigidly attached to a rotating table and in between these markers, we place an object, correct?


Is it enough to create a setup as shown on the picture?


Must the print size of the fiducial markers have a certain size?

No. You can use different markers (different cells count, size, etc). But you should change fiducial configuration file (fiducial.yaml) for your markers.

Are there any crucial aspects I have to be aware of in my preparation?

I think no. You should only write bag file with object rotation.

2011-03-23 05:05:43 -0500 received badge  Supporter (source)
2011-03-23 05:04:57 -0500 commented answer Does tod_training in object_recognition require fiducial markers on training images?
Also I recommend you to learn old version of tutorial (for example They contain some useful information about fiducial markers and poses.
2011-03-23 04:32:23 -0500 answered a question Does tod_training in object_recognition require fiducial markers on training images?

I think it is impossible now. But you can modify tod_training (turn off finding fiducial markers and detection of transformation between current image and the some abstract coordinate system) :-) In tod_training we require fiducial marker(or markers) for detection transformation between different frames in bag file. For each frame we calculate transformation between the camera coordinate system and the some abstract coordinate system (where coordinates of chessboard corners are the same as in fiducial.yaml). Calculated pose is saved to Features3d->Camera->Pose. Using this information we can merge point clouds from different images to the one for example.

You can use other fiducial markers (one or some chessboards or grids of circles). Parameters of your fiducial marker/markers should be in fiducial.yaml file. tod_training package contains tool for generating this file.

2011-03-23 01:59:58 -0500 answered a question How to do object recognition with kinect?

You can see tod_* packages (textured object detection). It gives good detection rate on Kinect data.

2011-03-23 01:28:50 -0500 answered a question Pose (rvec, tvec) from Opencv

rvec and tvec determine transformation between coordinate systems. rvec uniquely determines rotation matrix 3x3 (let it be named R). Transformation equation (T - transpose): (x y z)T = R*(X Y Z)T + tvec

Rodrigues function from OpenCV can convert rvec to R or R to rvec. Direction of rvec vector is the same with the axis of rotation, magnitude of the vector is angle of rotation.

Also OpenCV contains solvePnPRansac function in calib3d module. If you have incorrect matches you should use it.

2011-03-22 20:06:12 -0500 answered a question Recording a tod_training bag

Hello! For recording bags we have our own program - tod_training image_pcl_recorder You can launch this for the openni by running: roslaunch tod_training record_openni.launch bag:=pwd/awesome.bag interval:=0.5

It writes bag file with needed topic names. Best regards, Alexander.