parent
b260382840
commit
b46d23a2aa
4 changed files with 55 additions and 385 deletions
@ -1,63 +0,0 @@ |
|||||||
#include <opencv2/video/background_segm.hpp> |
|
||||||
#include <opencv2/highgui/highgui.hpp> |
|
||||||
|
|
||||||
#include <stdio.h> |
|
||||||
|
|
||||||
//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; |
|
||||||
} |
|
@ -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; |
|
||||||
} |
|
||||||
|
|
@ -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 <stdio.h> |
|
||||||
|
|
||||||
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<Vec3f>(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 <left_image> <right_image> [--algorithm=bm|sgbm|hh] [--blocksize=<block_size>]\n" |
|
||||||
"[--max-disparity=<max_disparity>] [-i <intrinsic_filename>] [-e <extrinsic_filename>]\n" |
|
||||||
"[--no-display] [-o <disparity_image>] [-p <point_cloud_file>]\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; |
|
||||||
} |
|
@ -0,0 +1,55 @@ |
|||||||
|
#include "opencv2/highgui/highgui.hpp" |
||||||
|
#include "opencv2/imgproc/imgproc.hpp" |
||||||
|
|
||||||
|
#include <iostream> |
||||||
|
|
||||||
|
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 <image_name>" << endl; |
||||||
|
} |
||||||
|
|
||||||
|
Mat dst, cdst; |
||||||
|
Canny(src, dst, 50, 200, 3); |
||||||
|
cvtColor(dst, cdst, CV_GRAY2BGR); |
||||||
|
|
||||||
|
#if 0 |
||||||
|
vector<Vec2f> 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<Vec4i> 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; |
||||||
|
} |
||||||
|
|
Loading…
Reference in new issue