Last active
November 16, 2015 08:33
-
-
Save minhoolee/ea6285613c8bc3948d2d to your computer and use it in GitHub Desktop.
MVRT Vision Trainings Week 8
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "opencv2/core/core.hpp" | |
#include "opencv2/imgproc/imgproc.hpp" | |
#include "opencv2/highgui/highgui.hpp" | |
#include <iostream> | |
int main(int argc, char ** argv) | |
{ | |
const char* filename = argc >=2 ? argv[1] : "lena.jpg"; | |
Mat I = imread(filename, CV_LOAD_IMAGE_GRAYSCALE); | |
if( I.empty()) | |
return -1; | |
Mat padded; //expand input image to optimal size | |
int m = getOptimalDFTSize( I.rows ); | |
int n = getOptimalDFTSize( I.cols ); // on the border add zero values | |
copyMakeBorder(I, padded, 0, m - I.rows, 0, n - I.cols, BORDER_CONSTANT, Scalar::all(0)); | |
Mat planes[] = {Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F)}; | |
Mat complexI; | |
merge(planes, 2, complexI); // Add to the expanded another plane with zeros | |
dft(complexI, complexI); // this way the result may fit in the source matrix | |
// compute the magnitude and switch to logarithmic scale | |
// => log(1 + sqrt(Re(DFT(I))^2 + Im(DFT(I))^2)) | |
split(complexI, planes); // planes[0] = Re(DFT(I), planes[1] = Im(DFT(I)) | |
magnitude(planes[0], planes[1], planes[0]);// planes[0] = magnitude | |
Mat magI = planes[0]; | |
magI += Scalar::all(1); // switch to logarithmic scale | |
log(magI, magI); | |
// crop the spectrum, if it has an odd number of rows or columns | |
magI = magI(Rect(0, 0, magI.cols & -2, magI.rows & -2)); | |
// rearrange the quadrants of Fourier image so that the origin is at the image center | |
int cx = magI.cols/2; | |
int cy = magI.rows/2; | |
Mat q0(magI, Rect(0, 0, cx, cy)); // Top-Left - Create a ROI per quadrant | |
Mat q1(magI, Rect(cx, 0, cx, cy)); // Top-Right | |
Mat q2(magI, Rect(0, cy, cx, cy)); // Bottom-Left | |
Mat q3(magI, Rect(cx, cy, cx, cy)); // Bottom-Right | |
Mat tmp; // swap quadrants (Top-Left with Bottom-Right) | |
q0.copyTo(tmp); | |
q3.copyTo(q0); | |
tmp.copyTo(q3); | |
q1.copyTo(tmp); // swap quadrant (Top-Right with Bottom-Left) | |
q2.copyTo(q1); | |
tmp.copyTo(q2); | |
normalize(magI, magI, 0, 1, CV_MINMAX); // Transform the matrix with float values into a | |
// viewable image form (float between values 0 and 1). | |
imshow("Input Image" , I ); // Show the result | |
imshow("spectrum magnitude", magI); | |
waitKey(); | |
return 0; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* This is a standalone program. Pass an image name as the first parameter | |
of the program. Switch between standard and probabilistic Hough transform | |
by changing "#if 1" to "#if 0" and back */ | |
#include <cv.h> | |
#include <highgui.h> | |
#include <math.h> | |
using namespace cv; | |
int main(int argc, char** argv) | |
{ | |
Mat src, dst, color_dst; | |
if( argc != 2 || !(src=imread(argv[1], 0)).data) | |
return -1; | |
Canny( src, dst, 50, 200, 3 ); | |
cvtColor( dst, color_dst, CV_GRAY2BGR ); | |
#if 0 | |
vector<Vec2f> lines; | |
HoughLines( dst, lines, 1, CV_PI/180, 100 ); | |
for( size_t i = 0; i < lines.size(); i++ ) | |
{ | |
float rho = lines[i][0]; | |
float theta = lines[i][1]; | |
double a = cos(theta), b = sin(theta); | |
double x0 = a*rho, y0 = b*rho; | |
Point pt1(cvRound(x0 + 1000*(-b)), | |
cvRound(y0 + 1000*(a))); | |
Point pt2(cvRound(x0 - 1000*(-b)), | |
cvRound(y0 - 1000*(a))); | |
line( color_dst, pt1, pt2, Scalar(0,0,255), 3, 8 ); | |
} | |
#else | |
vector<Vec4i> lines; | |
HoughLinesP( dst, lines, 1, CV_PI/180, 80, 30, 10 ); | |
for( size_t i = 0; i < lines.size(); i++ ) | |
{ | |
line( color_dst, Point(lines[i][0], lines[i][1]), | |
Point(lines[i][2], lines[i][3]), Scalar(0,0,255), 3, 8 ); | |
} | |
#endif | |
namedWindow( "Source", 1 ); | |
imshow( "Source", src ); | |
namedWindow( "Detected Lines", 1 ); | |
imshow( "Detected Lines", color_dst ); | |
waitKey(0); | |
return 0; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "opencv2/imgproc/imgproc.hpp" | |
#include "opencv2/highgui/highgui.hpp" | |
#include <stdlib.h> | |
#include <stdio.h> | |
using namespace cv; | |
/** @function main */ | |
int main( int argc, char** argv ) | |
{ | |
Mat src, src_gray, dst; | |
int kernel_size = 3; | |
int scale = 1; | |
int delta = 0; | |
int ddepth = CV_16S; | |
char* window_name = "Laplace Demo"; | |
int c; | |
/// Load an image | |
src = imread( argv[1] ); | |
if( !src.data ) | |
{ return -1; } | |
/// Remove noise by blurring with a Gaussian filter | |
GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT ); | |
/// Convert the image to grayscale | |
cvtColor( src, src_gray, CV_BGR2GRAY ); | |
/// Create window | |
namedWindow( window_name, CV_WINDOW_AUTOSIZE ); | |
/// Apply Laplace function | |
Mat abs_dst; | |
Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT ); | |
convertScaleAbs( dst, abs_dst ); | |
/// Show what you got | |
imshow( window_name, abs_dst ); | |
waitKey(0); | |
return 0; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "opencv2/xfeatures2d.hpp" | |
// NOTE: This code does not run, it is merely a snippet of working code | |
// now, you can no more create an instance on the 'stack', like in the tutorial | |
// (yea, noticed for a fix/pr). | |
// you will have to use cv::Ptr all the way down: | |
// | |
cv::Ptr<Feature2D> f2d = xfeatures2d::SIFT::create(); | |
//cv::Ptr<Feature2D> f2d = xfeatures2d::SURF::create(); | |
//cv::Ptr<Feature2D> f2d = ORB::create(); | |
// you get the picture, i hope.. | |
//-- Step 1: Detect the keypoints: | |
std::vector<KeyPoint> keypoints_1, keypoints_2; | |
f2d->detect( img_1, keypoints_1 ); | |
f2d->detect( img_2, keypoints_2 ); | |
//-- Step 2: Calculate descriptors (feature vectors) | |
Mat descriptors_1, descriptors_2; | |
f2d->compute( img_1, keypoints_1, descriptors_1 ); | |
f2d->compute( img_2, keypoints_2, descriptors_2 ); | |
//-- Step 3: Matching descriptor vectors using BFMatcher : | |
BFMatcher matcher; | |
std::vector< DMatch > matches; | |
matcher.match( descriptors_1, descriptors_2, matches ); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment