3 #include <opencv2/imgcodecs.hpp> 4 #include <opencv2/calib3d.hpp> 5 #include <opencv2/highgui.hpp> 6 #include <opencv2/imgproc/imgproc.hpp> 8 int main(
int argc,
char **argv){
10 std::string left_im =
"/home/tori/UWsim/Peg/cameraL_front.png";
11 std::string right_im =
"/home/tori/UWsim/Peg/cameraR_front.png";
13 cv::Mat left = cv::imread(left_im , cv::IMREAD_COLOR);
16 std::cout<<
"Cannot read image file: "<<left_im;
20 cv::Mat right = cv::imread(right_im, cv::IMREAD_COLOR);
23 std::cout<<
"Cannot read image file: "<<right_im;
33 cv::cvtColor(right, right_single, cv::COLOR_BGR2GRAY);
34 cv::cvtColor(right, right_GRAY, cv::COLOR_BGR2GRAY);
40 cv::cvtColor(left, left_single, cv::COLOR_BGR2GRAY);
41 cv::cvtColor(left, left_GRAY, cv::COLOR_BGR2GRAY);
45 cv::medianBlur(right_single, right_single, 3);
46 cv::medianBlur(left_single, left_single, 3);
48 cv::imshow(
"blurredRight", right_single);
50 cv::imshow(
"blurredLeft", left_single);
53 std::vector<cv::Vec3f> circles;
54 cv::HoughCircles(right_single, circles, cv::HOUGH_GRADIENT, 1,
61 for(
size_t i = 0; i < circles.size(); i++ )
63 std::cout <<
"detected" <<
"\n";
64 cv::Vec3i c = circles[i];
65 cv::Point center = cv::Point(c[0], c[1]);
67 cv::circle( right_single, center, 1, cv::Scalar(0,100,100), 1, cv::LINE_AA);
70 cv::circle( right_single, center, radius, cv::Scalar(255,0,255), 1, cv::LINE_AA);
72 cv::imshow(
"detected circles right", right_single);
75 std::vector<cv::Vec3f> circles2;
76 cv::HoughCircles(left_single, circles2, cv::HOUGH_GRADIENT, 1,
81 for(
size_t i = 0; i < circles2.size(); i++ )
83 std::cout <<
"detected" <<
"\n";
84 cv::Vec3i c = circles2[i];
85 cv::Point center = cv::Point(c[0], c[1]);
87 cv::circle( left_single, center, 1, cv::Scalar(0,100,100), 1, cv::LINE_AA);
90 cv::circle( left_single, center, radius, cv::Scalar(255,0,255), 1, cv::LINE_AA);
92 cv::imshow(
"detected circles left", left_single);
96 int numDisparities=48;
97 int blockSize=std::atoi(argv[1]);
98 cv::Ptr<cv::StereoMatcher> stereo = cv::StereoBM::create(numDisparities, blockSize);
100 stereo->compute(left_GRAY, right_GRAY, disparity);
103 cv::Mat intrParam = (cv::Mat_<double>(3,3) <<
104 257.34082279179285, 0.0, 160.0,
105 0.0, 257.34083046114705, 120.0,
108 cv::Mat lRr = cv::Mat::eye(3,3, CV_64F);
109 cv::Mat lDistr = (cv::Mat_<double>(3,1) << 0.19999999999999984, 0.0, 0.0);
110 cv::Mat distorsionParam = cv::Mat::zeros(5,1, CV_64F) ;
111 cv::Size imageSize(right_single.rows, right_single.cols);
115 cv::Mat lRectR = cv::Mat::zeros(3,3, CV_64F);
116 cv::Mat rRectR = cv::Mat::zeros(3,3, CV_64F);
117 cv::Mat lProject = cv::Mat::zeros(3,4, CV_64F);
118 cv::Mat rProject = cv::Mat::zeros(3,4, CV_64F);
119 cv::Mat disp2depthMap = cv::Mat::zeros(4,4, CV_64F);
120 cv::stereoRectify(intrParam, distorsionParam, intrParam, distorsionParam,
121 imageSize, lRr, lDistr,
122 lRectR, rRectR, lProject, rProject ,
126 std::cout <<
"lRectR:\n" << lRectR <<
"\n\n";
127 std::cout <<
"rRectR:\n" << rRectR <<
"\n\n";
128 std::cout <<
"lProject:\n" << lProject <<
"\n\n";
129 std::cout <<
"rProject:\n" << rProject <<
"\n\n";
130 std::cout <<
"disp2depthMap (Q):\n" << disp2depthMap <<
"\n\n";
135 disparity.convertTo(disp8U, CV_8U);
136 cv::imshow(
"disparity", disp8U);
141 cv::medianBlur(disp8U, disp8UFilt, 3);
142 cv::imshow(
"disp blurred", disp8UFilt);
144 cv::Mat disp8UCirc = disp8UFilt;
145 for(
size_t i = 0; i < circles2.size(); i++ )
147 cv::Vec3i c = circles2[i];
148 cv::Point center = cv::Point(c[0], c[1]);
150 cv::circle( disp8UCirc, center, 1, cv::Scalar(0,100,100), 1, cv::LINE_AA);
153 cv::circle( disp8UCirc, center, radius, cv::Scalar(255,0,255), 3, cv::LINE_AA);
155 cv::imshow(
"disparityCirc", disp8UCirc);
180 cv::Mat centerL(1,1,CV_32FC2);
181 cv::Mat centerR(1,1,CV_32FC2);
182 centerL.at<cv::Vec2f>(0,0)[0] = circles2[0][0];
183 centerL.at<cv::Vec2f>(0,0)[1] = circles2[0][1];
184 centerR.at<cv::Vec2f>(0,0)[0] = circles[0][0];
185 centerR.at<cv::Vec2f>(0,0)[1] = circles[0][1];
190 cv::triangulatePoints( lProject, rProject, centerL, centerR, pnts3D );
193 cv::Mat t = pnts3D.t();
194 cv::Mat pnts3DT = cv::Mat( 1, 1, CV_32FC4, t.data );
196 cv::Mat resultPoints;
197 cv::convertPointsFromHomogeneous( pnts3DT, resultPoints );
198 std::cout <<
"3D POIMT triangulat " << pnts3DT << std::endl;
202 std::vector<cv::Vec3f> surfacePoints, realSurfacePoints;
205 for(
int i=0;i<N;i++) {
210 disparity = circles2[0][0] - circles[0][0];
211 std::cout <<
"asdas\n" << disparity <<
"\n\n";
213 surfacePoints.push_back(cv::Vec3f(circles2[0][0], circles2[0][1], disparity));
216 cv::perspectiveTransform(surfacePoints, realSurfacePoints, disp2depthMap);
217 std::cout <<
"3D POIMT tizio " << realSurfacePoints.at(0) << std::endl;