From b46d23a2aac526b308240511c22805971fb499a1 Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Mon, 29 Nov 2010 14:00:21 +0000 Subject: [PATCH] converted houghlines to C++ --- samples/c/bgfg_segm.cpp | 63 --------- samples/c/houghlines.c | 57 -------- samples/c/stereo_match.cpp | 265 ------------------------------------- samples/cpp/houghlines.cpp | 55 ++++++++ 4 files changed, 55 insertions(+), 385 deletions(-) delete mode 100644 samples/c/bgfg_segm.cpp delete mode 100644 samples/c/houghlines.c delete mode 100644 samples/c/stereo_match.cpp create mode 100644 samples/cpp/houghlines.cpp diff --git a/samples/c/bgfg_segm.cpp b/samples/c/bgfg_segm.cpp deleted file mode 100644 index b8d7bdcadb..0000000000 --- a/samples/c/bgfg_segm.cpp +++ /dev/null @@ -1,63 +0,0 @@ -#include -#include - -#include - -//this is a sample for foreground detection functions -int main(int argc, char** argv) -{ - IplImage* tmp_frame = NULL; - CvCapture* cap = NULL; - bool update_bg_model = true; - - if( argc < 2 ) - cap = cvCaptureFromCAM(0); - else - cap = cvCaptureFromFile(argv[1]); - - if( !cap ) - { - printf("can not open camera or video file\n"); - return -1; - } - - tmp_frame = cvQueryFrame(cap); - if(!tmp_frame) - { - printf("can not read data from the video source\n"); - return -1; - } - - cvNamedWindow("BG", 1); - cvNamedWindow("FG", 1); - - CvBGStatModel* bg_model = 0; - - for( int fr = 1;tmp_frame; tmp_frame = cvQueryFrame(cap), fr++ ) - { - if(!bg_model) - { - //create BG model - bg_model = cvCreateGaussianBGModel( tmp_frame ); - //bg_model = cvCreateFGDStatModel( temp ); - continue; - } - - double t = (double)cvGetTickCount(); - cvUpdateBGStatModel( tmp_frame, bg_model, update_bg_model ? -1 : 0 ); - t = (double)cvGetTickCount() - t; - printf( "%d. %.1f\n", fr, t/(cvGetTickFrequency()*1000.) ); - cvShowImage("BG", bg_model->background); - cvShowImage("FG", bg_model->foreground); - char k = cvWaitKey(5); - if( k == 27 ) break; - if( k == ' ' ) - update_bg_model = !update_bg_model; - } - - - cvReleaseBGStatModel( &bg_model ); - cvReleaseCapture(&cap); - - return 0; -} diff --git a/samples/c/houghlines.c b/samples/c/houghlines.c deleted file mode 100644 index 6291f3571d..0000000000 --- a/samples/c/houghlines.c +++ /dev/null @@ -1,57 +0,0 @@ -#include "opencv2/highgui/highgui.hpp" -#include "opencv2/imgproc/imgproc_c.h" - -int main(int argc, char** argv) -{ - const char* filename = argc >= 2 ? argv[1] : "pic1.png"; - IplImage* src = cvLoadImage( filename, 0 ); - IplImage* dst; - IplImage* color_dst; - CvMemStorage* storage = cvCreateMemStorage(0); - CvSeq* lines = 0; - int i; - - if( !src ) - return -1; - - dst = cvCreateImage( cvGetSize(src), 8, 1 ); - color_dst = cvCreateImage( cvGetSize(src), 8, 3 ); - - cvCanny( src, dst, 50, 200, 3 ); - cvCvtColor( dst, color_dst, CV_GRAY2BGR ); -#if 0 - lines = cvHoughLines2( dst, storage, CV_HOUGH_STANDARD, 1, CV_PI/180, 100, 0, 0 ); - - for( i = 0; i < MIN(lines->total,100); i++ ) - { - float* line = (float*)cvGetSeqElem(lines,i); - float rho = line[0]; - float theta = line[1]; - CvPoint pt1, pt2; - double a = cos(theta), b = sin(theta); - double x0 = a*rho, y0 = b*rho; - pt1.x = cvRound(x0 + 1000*(-b)); - pt1.y = cvRound(y0 + 1000*(a)); - pt2.x = cvRound(x0 - 1000*(-b)); - pt2.y = cvRound(y0 - 1000*(a)); - cvLine( color_dst, pt1, pt2, CV_RGB(255,0,0), 3, CV_AA, 0 ); - } -#else - lines = cvHoughLines2( dst, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 50, 50, 10 ); - for( i = 0; i < lines->total; i++ ) - { - CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i); - cvLine( color_dst, line[0], line[1], CV_RGB(255,0,0), 3, CV_AA, 0 ); - } -#endif - cvNamedWindow( "Source", 1 ); - cvShowImage( "Source", src ); - - cvNamedWindow( "Hough", 1 ); - cvShowImage( "Hough", color_dst ); - - cvWaitKey(0); - - return 0; -} - diff --git a/samples/c/stereo_match.cpp b/samples/c/stereo_match.cpp deleted file mode 100644 index 16ac6b2f11..0000000000 --- a/samples/c/stereo_match.cpp +++ /dev/null @@ -1,265 +0,0 @@ -/* - * stereo_match.cpp - * calibration - * - * Created by Victor Eruhimov on 1/18/10. - * Copyright 2010 Argus Corp. All rights reserved. - * - */ - -#include "opencv2/calib3d/calib3d.hpp" -#include "opencv2/imgproc/imgproc.hpp" -#include "opencv2/highgui/highgui.hpp" - -#include - -using namespace cv; - -void saveXYZ(const char* filename, const Mat& mat) -{ - const double max_z = 1.0e4; - FILE* fp = fopen(filename, "wt"); - for(int y = 0; y < mat.rows; y++) - { - for(int x = 0; x < mat.cols; x++) - { - Vec3f point = mat.at(y, x); - if(fabs(point[2] - max_z) < FLT_EPSILON || fabs(point[2]) > max_z) continue; - fprintf(fp, "%f %f %f\n", point[0], point[1], point[2]); - } - } - fclose(fp); -} - -void print_help() -{ - printf("Usage: stereo_match [--algorithm=bm|sgbm|hh] [--blocksize=]\n" - "[--max-disparity=] [-i ] [-e ]\n" - "[--no-display] [-o ] [-p ]\n"); -} - -int main(int argc, char** argv) -{ - const char* algorithm_opt = "--algorithm="; - const char* maxdisp_opt = "--max-disparity="; - const char* blocksize_opt = "--blocksize="; - const char* nodisplay_opt = "--no-display="; - - if(argc < 3) - { - print_help(); - return 0; - } - const char* img1_filename = 0; - const char* img2_filename = 0; - const char* intrinsic_filename = 0; - const char* extrinsic_filename = 0; - const char* disparity_filename = 0; - const char* point_cloud_filename = 0; - - enum { STEREO_BM=0, STEREO_SGBM=1, STEREO_HH=2 }; - int alg = STEREO_SGBM; - int SADWindowSize = 0, numberOfDisparities = 0; - bool no_display = false; - - StereoBM bm; - StereoSGBM sgbm; - - for( int i = 1; i < argc; i++ ) - { - if( argv[i][0] != '-' ) - { - if( !img1_filename ) - img1_filename = argv[i]; - else - img2_filename = argv[i]; - } - else if( strncmp(argv[i], algorithm_opt, strlen(algorithm_opt)) == 0 ) - { - char* _alg = argv[i] + strlen(algorithm_opt); - alg = strcmp(_alg, "bm") == 0 ? STEREO_BM : - strcmp(_alg, "sgbm") == 0 ? STEREO_SGBM : - strcmp(_alg, "hh") == 0 ? STEREO_HH : -1; - if( alg < 0 ) - { - printf("Command-line parameter error: Unknown stereo algorithm\n\n"); - print_help(); - return -1; - } - } - else if( strncmp(argv[i], maxdisp_opt, strlen(maxdisp_opt)) == 0 ) - { - if( sscanf( argv[i] + strlen(maxdisp_opt), "%d", &numberOfDisparities ) != 1 || - numberOfDisparities < 1 || numberOfDisparities % 16 != 0 ) - { - printf("Command-line parameter error: The max disparity (--maxdisparity=<...>) must be a positive integer divisible by 16\n"); - print_help(); - return -1; - } - } - else if( strncmp(argv[i], blocksize_opt, strlen(blocksize_opt)) == 0 ) - { - if( sscanf( argv[i] + strlen(blocksize_opt), "%d", &SADWindowSize ) != 1 || - SADWindowSize < 1 || SADWindowSize % 2 != 1 ) - { - printf("Command-line parameter error: The block size (--blocksize=<...>) must be a positive odd number\n"); - return -1; - } - } - else if( strcmp(argv[i], nodisplay_opt) == 0 ) - no_display = true; - else if( strcmp(argv[i], "-i" ) == 0 ) - intrinsic_filename = argv[++i]; - else if( strcmp(argv[i], "-e" ) == 0 ) - extrinsic_filename = argv[++i]; - else if( strcmp(argv[i], "-o" ) == 0 ) - disparity_filename = argv[++i]; - else if( strcmp(argv[i], "-p" ) == 0 ) - point_cloud_filename = argv[++i]; - else - { - printf("Command-line parameter error: unknown option %s\n", argv[i]); - return -1; - } - } - - if( !img1_filename || !img2_filename ) - { - printf("Command-line parameter error: both left and right images must be specified\n"); - return -1; - } - - if( (intrinsic_filename != 0) ^ (extrinsic_filename != 0) ) - { - printf("Command-line parameter error: either both intrinsic and extrinsic parameters must be specified, or none of them (when the stereo pair is already rectified)\n"); - return -1; - } - - if( extrinsic_filename == 0 && point_cloud_filename ) - { - printf("Command-line parameter error: extrinsic and intrinsic parameters must be specified to compute the point cloud\n"); - return -1; - } - - int color_mode = alg == STEREO_BM ? 0 : -1; - Mat img1 = imread(img1_filename, color_mode); - Mat img2 = imread(img2_filename, color_mode); - Size img_size = img1.size(); - - Rect roi1, roi2; - Mat Q; - - if( intrinsic_filename ) - { - // reading intrinsic parameters - FileStorage fs(intrinsic_filename, CV_STORAGE_READ); - if(!fs.isOpened()) - { - printf("Failed to open file %s\n", intrinsic_filename); - return -1; - } - - Mat M1, D1, M2, D2; - fs["M1"] >> M1; - fs["D1"] >> D1; - fs["M2"] >> M2; - fs["D2"] >> D2; - - fs.open(extrinsic_filename, CV_STORAGE_READ); - if(!fs.isOpened()) - { - printf("Failed to open file %s\n", extrinsic_filename); - return -1; - } - - Mat R, T, R1, P1, R2, P2; - fs["R"] >> R; - fs["T"] >> T; - - stereoRectify( M1, D1, M2, D2, img_size, R, T, R1, R2, P1, P2, Q, -1, img_size, &roi1, &roi2 ); - - Mat map11, map12, map21, map22; - initUndistortRectifyMap(M1, D1, R1, P1, img_size, CV_16SC2, map11, map12); - initUndistortRectifyMap(M2, D2, R2, P2, img_size, CV_16SC2, map21, map22); - - Mat img1r, img2r; - remap(img1, img1r, map11, map12, INTER_LINEAR); - remap(img2, img2r, map21, map22, INTER_LINEAR); - - img1 = img1r; - img2 = img2r; - } - - numberOfDisparities = numberOfDisparities > 0 ? numberOfDisparities : img_size.width/8; - - bm.state->roi1 = roi1; - bm.state->roi2 = roi2; - bm.state->preFilterCap = 31; - bm.state->SADWindowSize = SADWindowSize > 0 ? SADWindowSize : 9; - bm.state->minDisparity = 0; - bm.state->numberOfDisparities = numberOfDisparities; - bm.state->textureThreshold = 10; - bm.state->uniquenessRatio = 15; - bm.state->speckleWindowSize = 100; - bm.state->speckleRange = 32; - bm.state->disp12MaxDiff = 1; - - sgbm.preFilterCap = 63; - sgbm.SADWindowSize = SADWindowSize > 0 ? SADWindowSize : 3; - - int cn = img1.channels(); - - sgbm.P1 = 8*cn*sgbm.SADWindowSize*sgbm.SADWindowSize; - sgbm.P2 = 32*cn*sgbm.SADWindowSize*sgbm.SADWindowSize; - sgbm.minDisparity = 0; - sgbm.numberOfDisparities = numberOfDisparities; - sgbm.uniquenessRatio = 10; - sgbm.speckleWindowSize = bm.state->speckleWindowSize; - sgbm.speckleRange = bm.state->speckleRange; - sgbm.disp12MaxDiff = 1; - sgbm.fullDP = alg == STEREO_HH; - - Mat disp, disp8; - //Mat img1p, img2p, dispp; - //copyMakeBorder(img1, img1p, 0, 0, numberOfDisparities, 0, IPL_BORDER_REPLICATE); - //copyMakeBorder(img2, img2p, 0, 0, numberOfDisparities, 0, IPL_BORDER_REPLICATE); - - int64 t = getTickCount(); - if( alg == STEREO_BM ) - bm(img1, img2, disp); - else - sgbm(img1, img2, disp); - t = getTickCount() - t; - printf("Time elapsed: %fms\n", t*1000/getTickFrequency()); - - //disp = dispp.colRange(numberOfDisparities, img1p.cols); - disp.convertTo(disp8, CV_8U, 255/(numberOfDisparities*16.)); - if( !no_display ) - { - namedWindow("left", 1); - imshow("left", img1); - namedWindow("right", 1); - imshow("right", img2); - namedWindow("disparity", 0); - imshow("disparity", disp8); - printf("press any key to continue..."); - fflush(stdout); - waitKey(); - printf("\n"); - } - - if(disparity_filename) - imwrite(disparity_filename, disp8); - - if(point_cloud_filename) - { - printf("storing the point cloud..."); - fflush(stdout); - Mat xyz; - reprojectImageTo3D(disp, xyz, Q, true); - saveXYZ(point_cloud_filename, xyz); - printf("\n"); - } - - return 0; -} diff --git a/samples/cpp/houghlines.cpp b/samples/cpp/houghlines.cpp new file mode 100644 index 0000000000..f6dcf12091 --- /dev/null +++ b/samples/cpp/houghlines.cpp @@ -0,0 +1,55 @@ +#include "opencv2/highgui/highgui.hpp" +#include "opencv2/imgproc/imgproc.hpp" + +#include + +using namespace cv; +using namespace std; + +int main(int argc, char** argv) +{ + const char* filename = argc >= 2 ? argv[1] : "pic1.png"; + + Mat src = imread(filename, 0); + if(src.empty()) + { + cout << "can not open " << filename << endl; + cout << "Usage: houghlines " << endl; + } + + Mat dst, cdst; + Canny(src, dst, 50, 200, 3); + cvtColor(dst, cdst, CV_GRAY2BGR); + +#if 0 + vector lines; + HoughLines(dst, lines, 1, CV_PI/180, 100, 0, 0 ); + + for( size_t i = 0; i < lines.size(); i++ ) + { + float rho = lines[i][0], theta = lines[i][1]; + Point pt1, pt2; + double a = cos(theta), b = sin(theta); + double x0 = a*rho, y0 = b*rho; + pt1.x = cvRound(x0 + 1000*(-b)); + pt1.y = cvRound(y0 + 1000*(a)); + pt2.x = cvRound(x0 - 1000*(-b)); + pt2.y = cvRound(y0 - 1000*(a)); + line( cdst, pt1, pt2, Scalar(0,0,255), 3, CV_AA); + } +#else + vector lines; + HoughLinesP(dst, lines, 1, CV_PI/180, 50, 50, 10 ); + for( size_t i = 0; i < lines.size(); i++ ) + { + Vec4i l = lines[i]; + line( cdst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,0,255), 3, CV_AA); + } +#endif + imshow("source", src); + imshow("detected lines", cdst); + + waitKey(); + return 0; +} +