mirror of
https://github.com/opencv/opencv.git
synced 2025-06-24 21:10:56 +08:00
Added sample code for tutorial - cpp
This commit is contained in:
parent
d198e39d35
commit
98e13cec87
52
samples/cpp/tutorial_code/Basic/AddingImages.cpp
Normal file
52
samples/cpp/tutorial_code/Basic/AddingImages.cpp
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/**
|
||||||
|
* @file AddingImages.cpp
|
||||||
|
* @brief Simple linear blender ( dst = alpha*src1 + beta*src2 )
|
||||||
|
* @author OpenCV team
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cv.h>
|
||||||
|
#include <highgui.h>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
using namespace cv;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function main
|
||||||
|
* @brief Main function
|
||||||
|
*/
|
||||||
|
int main( int argc, char** argv )
|
||||||
|
{
|
||||||
|
|
||||||
|
double alpha = 0.5; double beta; double input;
|
||||||
|
|
||||||
|
Mat src1, src2, dst;
|
||||||
|
|
||||||
|
/// Ask the user enter alpha
|
||||||
|
std::cout<<" Simple Linear Blender "<<std::endl;
|
||||||
|
std::cout<<"-----------------------"<<std::endl;
|
||||||
|
std::cout<<"* Enter alpha [0-1]: ";
|
||||||
|
std::cin>>input;
|
||||||
|
|
||||||
|
// We use the alpha provided by the user iff it is between 0 and 1
|
||||||
|
if( alpha >= 0 && alpha <= 1 )
|
||||||
|
{ alpha = input; }
|
||||||
|
|
||||||
|
/// Read image ( same size, same type )
|
||||||
|
src1 = imread("../../images/LinuxLogo.jpg");
|
||||||
|
src2 = imread("../../images/WindowsLogo.jpg");
|
||||||
|
|
||||||
|
if( !src1.data ) { printf("Error loading src1 \n"); return -1; }
|
||||||
|
if( !src2.data ) { printf("Error loading src2 \n"); return -1; }
|
||||||
|
|
||||||
|
/// Create Windows
|
||||||
|
namedWindow("Linear Blend", 1);
|
||||||
|
|
||||||
|
beta = ( 1.0 - alpha );
|
||||||
|
addWeighted( src1, alpha, src2, beta, 0.0, dst);
|
||||||
|
|
||||||
|
imshow( "Linear Blend", dst );
|
||||||
|
|
||||||
|
|
||||||
|
waitKey(0);
|
||||||
|
return 0;
|
||||||
|
}
|
69
samples/cpp/tutorial_code/Basic/AddingImagesTrackbar.cpp
Normal file
69
samples/cpp/tutorial_code/Basic/AddingImagesTrackbar.cpp
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
/**
|
||||||
|
* @file LinearBlend.cpp
|
||||||
|
* @brief Simple linear blender ( dst = alpha*src1 + beta*src2 )
|
||||||
|
* @author OpenCV team
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cv.h>
|
||||||
|
#include <highgui.h>
|
||||||
|
|
||||||
|
using namespace cv;
|
||||||
|
|
||||||
|
/** Global Variables */
|
||||||
|
const int alpha_slider_max = 100;
|
||||||
|
int alpha_slider;
|
||||||
|
double alpha;
|
||||||
|
double beta;
|
||||||
|
|
||||||
|
/** Matrices to store images */
|
||||||
|
Mat src1;
|
||||||
|
Mat src2;
|
||||||
|
Mat dst;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function on_trackbar
|
||||||
|
* @brief Callback for trackbar
|
||||||
|
*/
|
||||||
|
void on_trackbar( int, void* )
|
||||||
|
{
|
||||||
|
alpha = (double) alpha_slider/alpha_slider_max ;
|
||||||
|
|
||||||
|
beta = ( 1.0 - alpha );
|
||||||
|
|
||||||
|
addWeighted( src1, alpha, src2, beta, 0.0, dst);
|
||||||
|
|
||||||
|
imshow( "Linear Blend", dst );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function main
|
||||||
|
* @brief Main function
|
||||||
|
*/
|
||||||
|
int main( int argc, char** argv )
|
||||||
|
{
|
||||||
|
/// Read image ( same size, same type )
|
||||||
|
src1 = imread("../../images/LinuxLogo.jpg");
|
||||||
|
src2 = imread("../../images/WindowsLogo.jpg");
|
||||||
|
|
||||||
|
if( !src1.data ) { printf("Error loading src1 \n"); return -1; }
|
||||||
|
if( !src2.data ) { printf("Error loading src2 \n"); return -1; }
|
||||||
|
|
||||||
|
/// Initialize values
|
||||||
|
alpha_slider = 0;
|
||||||
|
|
||||||
|
/// Create Windows
|
||||||
|
namedWindow("Linear Blend", 1);
|
||||||
|
|
||||||
|
/// Create Trackbars
|
||||||
|
char TrackbarName[50];
|
||||||
|
sprintf( TrackbarName, "Alpha x %d", alpha_slider_max );
|
||||||
|
createTrackbar( TrackbarName, "Linear Blend", &alpha_slider, alpha_slider_max, on_trackbar );
|
||||||
|
|
||||||
|
/// Show some stuff
|
||||||
|
on_trackbar( alpha_slider, 0 );
|
||||||
|
|
||||||
|
/// Wait until user press some key
|
||||||
|
waitKey(0);
|
||||||
|
return 0;
|
||||||
|
}
|
58
samples/cpp/tutorial_code/Basic/BasicLinearTransforms.cpp
Normal file
58
samples/cpp/tutorial_code/Basic/BasicLinearTransforms.cpp
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
/**
|
||||||
|
* @file BasicLinearTransforms.cpp
|
||||||
|
* @brief Simple program to change contrast and brightness
|
||||||
|
* @author OpenCV team
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cv.h>
|
||||||
|
#include <highgui.h>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
using namespace cv;
|
||||||
|
|
||||||
|
double alpha; /**< Simple contrast control */
|
||||||
|
int beta; /**< Simple brightness control */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function main
|
||||||
|
* @brief Main function
|
||||||
|
*/
|
||||||
|
int main( int argc, char** argv )
|
||||||
|
{
|
||||||
|
/// Read image given by user
|
||||||
|
Mat image = imread( argv[1] );
|
||||||
|
Mat new_image = Mat::zeros( image.size(), image.type() );
|
||||||
|
|
||||||
|
/// Initialize values
|
||||||
|
std::cout<<" Basic Linear Transforms "<<std::endl;
|
||||||
|
std::cout<<"-------------------------"<<std::endl;
|
||||||
|
std::cout<<"* Enter the alpha value [1.0-3.0]: ";std::cin>>alpha;
|
||||||
|
std::cout<<"* Enter the beta value [0-100]: "; std::cin>>beta;
|
||||||
|
|
||||||
|
|
||||||
|
/// Do the operation new_image(i,j) = alpha*image(i,j) + beta
|
||||||
|
/// Instead of these 'for' loops we could have used simply:
|
||||||
|
/// image.convertTo(new_image, -1, alpha, beta);
|
||||||
|
/// but we wanted to show you how to access the pixels :)
|
||||||
|
for( int y = 0; y < image.rows; y++ )
|
||||||
|
{ for( int x = 0; x < image.cols; x++ )
|
||||||
|
{ for( int c = 0; c < 3; c++ )
|
||||||
|
{
|
||||||
|
new_image.at<Vec3b>(y,x)[c] = saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Create Windows
|
||||||
|
namedWindow("Original Image", 1);
|
||||||
|
namedWindow("New Image", 1);
|
||||||
|
|
||||||
|
/// Show stuff
|
||||||
|
imshow("Original Image", image);
|
||||||
|
imshow("New Image", new_image);
|
||||||
|
|
||||||
|
|
||||||
|
/// Wait until user press some key
|
||||||
|
waitKey();
|
||||||
|
return 0;
|
||||||
|
}
|
@ -0,0 +1,71 @@
|
|||||||
|
/**
|
||||||
|
* @file LinearTransforms.cpp
|
||||||
|
* @brief Simple program to change contrast and brightness
|
||||||
|
* @date Mon, June 6, 2011
|
||||||
|
* @author OpenCV team
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cv.h>
|
||||||
|
#include <highgui.h>
|
||||||
|
|
||||||
|
using namespace cv;
|
||||||
|
|
||||||
|
/** Global Variables */
|
||||||
|
const int alpha_max = 5;
|
||||||
|
const int beta_max = 125;
|
||||||
|
int alpha; /**< Simple contrast control */
|
||||||
|
int beta; /**< Simple brightness control*/
|
||||||
|
|
||||||
|
/** Matrices to store images */
|
||||||
|
Mat image;
|
||||||
|
Mat new_image;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function on_trackbar
|
||||||
|
* @brief Called whenever any of alpha or beta changes
|
||||||
|
*/
|
||||||
|
void on_trackbar( int, void* )
|
||||||
|
{
|
||||||
|
Mat new_image = Mat::zeros( image.size(), image.type() );
|
||||||
|
|
||||||
|
for( int y = 0; y < image.rows; y++ )
|
||||||
|
{ for( int x = 0; x < image.cols; x++ )
|
||||||
|
{ for( int c = 0; c < 3; c++ )
|
||||||
|
{
|
||||||
|
new_image.at<Vec3b>(y,x)[c] = saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
imshow("New Image", new_image);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function main
|
||||||
|
* @brief Main function
|
||||||
|
*/
|
||||||
|
int main( int argc, char** argv )
|
||||||
|
{
|
||||||
|
/// Read image given by user
|
||||||
|
image = imread( argv[1] );
|
||||||
|
|
||||||
|
/// Initialize values
|
||||||
|
alpha = 1;
|
||||||
|
beta = 0;
|
||||||
|
|
||||||
|
/// Create Windows
|
||||||
|
namedWindow("Original Image", 1);
|
||||||
|
namedWindow("New Image", 1);
|
||||||
|
|
||||||
|
/// Create Trackbars
|
||||||
|
createTrackbar( "Contrast Trackbar", "New Image", &alpha, alpha_max, on_trackbar );
|
||||||
|
createTrackbar( "Brightness Trackbar", "New Image", &beta, beta_max, on_trackbar );
|
||||||
|
|
||||||
|
/// Show some stuff
|
||||||
|
imshow("Original Image", image);
|
||||||
|
imshow("New Image", image);
|
||||||
|
|
||||||
|
/// Wait until user press some key
|
||||||
|
waitKey();
|
||||||
|
return 0;
|
||||||
|
}
|
28
samples/cpp/tutorial_code/Basic/DisplayImage.cpp
Normal file
28
samples/cpp/tutorial_code/Basic/DisplayImage.cpp
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
/**
|
||||||
|
* @file DisplayImage.cpp
|
||||||
|
* @brief Sample code that show how to read and display an image in a OpenCV window
|
||||||
|
* @author OpenCV team
|
||||||
|
*/
|
||||||
|
#include <cv.h>
|
||||||
|
#include <highgui.h>
|
||||||
|
|
||||||
|
using namespace cv;
|
||||||
|
|
||||||
|
int main( int argc, char** argv )
|
||||||
|
{
|
||||||
|
Mat image;
|
||||||
|
image = imread( argv[1], 1 );
|
||||||
|
|
||||||
|
if( argc != 2 || !image.data )
|
||||||
|
{
|
||||||
|
printf( "No image data \n" );
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
namedWindow( "Display Image", CV_WINDOW_AUTOSIZE );
|
||||||
|
imshow( "Display Image", image );
|
||||||
|
|
||||||
|
waitKey(0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
172
samples/cpp/tutorial_code/Basic/Drawing_1.cpp
Normal file
172
samples/cpp/tutorial_code/Basic/Drawing_1.cpp
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
/**
|
||||||
|
* @file Drawing_1.cpp
|
||||||
|
* @brief Simple sample code
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <opencv2/core/core.hpp>
|
||||||
|
#include <opencv2/highgui/highgui.hpp>
|
||||||
|
|
||||||
|
#define w 400
|
||||||
|
|
||||||
|
using namespace cv;
|
||||||
|
|
||||||
|
/// Function headers
|
||||||
|
void MyEllipse( Mat img, double angle );
|
||||||
|
void MyFilledCircle( Mat img, Point center );
|
||||||
|
void MyPolygon( Mat img );
|
||||||
|
void MyLine( Mat img, Point start, Point end );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function main
|
||||||
|
* @brief Main function
|
||||||
|
*/
|
||||||
|
int main( int argc, char **argv ){
|
||||||
|
|
||||||
|
/// Windows names
|
||||||
|
char atom_window[] = "Drawing 1: Atom";
|
||||||
|
char rook_window[] = "Drawing 2: Rook";
|
||||||
|
|
||||||
|
/// Create black empty images
|
||||||
|
Mat atom_image = Mat::zeros( w, w, CV_8UC3 );
|
||||||
|
Mat rook_image = Mat::zeros( w, w, CV_8UC3 );
|
||||||
|
|
||||||
|
/// 1. Draw a simple atom:
|
||||||
|
/// -----------------------
|
||||||
|
|
||||||
|
/// 1.a. Creating ellipses
|
||||||
|
MyEllipse( atom_image, 90 );
|
||||||
|
MyEllipse( atom_image, 0 );
|
||||||
|
MyEllipse( atom_image, 45 );
|
||||||
|
MyEllipse( atom_image, -45 );
|
||||||
|
|
||||||
|
/// 1.b. Creating circles
|
||||||
|
MyFilledCircle( atom_image, Point( w/2.0, w/2.0) );
|
||||||
|
|
||||||
|
/// 2. Draw a rook
|
||||||
|
/// ------------------
|
||||||
|
|
||||||
|
/// 2.a. Create a convex polygon
|
||||||
|
MyPolygon( rook_image );
|
||||||
|
|
||||||
|
/// 2.b. Creating rectangles
|
||||||
|
rectangle( rook_image,
|
||||||
|
Point( 0, 7*w/8.0 ),
|
||||||
|
Point( w, w),
|
||||||
|
Scalar( 0, 255, 255 ),
|
||||||
|
-1,
|
||||||
|
8 );
|
||||||
|
|
||||||
|
/// 2.c. Create a few lines
|
||||||
|
MyLine( rook_image, Point( 0, 15*w/16 ), Point( w, 15*w/16 ) );
|
||||||
|
MyLine( rook_image, Point( w/4, 7*w/8 ), Point( w/4, w ) );
|
||||||
|
MyLine( rook_image, Point( w/2, 7*w/8 ), Point( w/2, w ) );
|
||||||
|
MyLine( rook_image, Point( 3*w/4, 7*w/8 ), Point( 3*w/4, w ) );
|
||||||
|
|
||||||
|
/// 3. Display your stuff!
|
||||||
|
imshow( atom_window, atom_image );
|
||||||
|
cvMoveWindow( atom_window, 0, 200 );
|
||||||
|
imshow( rook_window, rook_image );
|
||||||
|
cvMoveWindow( rook_window, w, 200 );
|
||||||
|
|
||||||
|
waitKey( 0 );
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Function Declaration
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function MyEllipse
|
||||||
|
* @brief Draw a fixed-size ellipse with different angles
|
||||||
|
*/
|
||||||
|
void MyEllipse( Mat img, double angle )
|
||||||
|
{
|
||||||
|
int thickness = 2;
|
||||||
|
int lineType = 8;
|
||||||
|
|
||||||
|
ellipse( img,
|
||||||
|
Point( w/2.0, w/2.0 ),
|
||||||
|
Size( w/4.0, w/16.0 ),
|
||||||
|
angle,
|
||||||
|
0,
|
||||||
|
360,
|
||||||
|
Scalar( 255, 0, 0 ),
|
||||||
|
thickness,
|
||||||
|
lineType );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function MyFilledCircle
|
||||||
|
* @brief Draw a fixed-size filled circle
|
||||||
|
*/
|
||||||
|
void MyFilledCircle( Mat img, Point center )
|
||||||
|
{
|
||||||
|
int thickness = -1;
|
||||||
|
int lineType = 8;
|
||||||
|
|
||||||
|
circle( img,
|
||||||
|
center,
|
||||||
|
w/32.0,
|
||||||
|
Scalar( 0, 0, 255 ),
|
||||||
|
thickness,
|
||||||
|
lineType );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function MyPolygon
|
||||||
|
* @function Draw a simple concave polygon (rook)
|
||||||
|
*/
|
||||||
|
void MyPolygon( Mat img )
|
||||||
|
{
|
||||||
|
int lineType = 8;
|
||||||
|
|
||||||
|
/** Create some points */
|
||||||
|
Point rook_points[1][20];
|
||||||
|
rook_points[0][0] = Point( w/4.0, 7*w/8.0 );
|
||||||
|
rook_points[0][1] = Point( 3*w/4.0, 7*w/8.0 );
|
||||||
|
rook_points[0][2] = Point( 3*w/4.0, 13*w/16.0 );
|
||||||
|
rook_points[0][3] = Point( 11*w/16.0, 13*w/16.0 );
|
||||||
|
rook_points[0][4] = Point( 19*w/32.0, 3*w/8.0 );
|
||||||
|
rook_points[0][5] = Point( 3*w/4.0, 3*w/8.0 );
|
||||||
|
rook_points[0][6] = Point( 3*w/4.0, w/8.0 );
|
||||||
|
rook_points[0][7] = Point( 26*w/40.0, w/8.0 );
|
||||||
|
rook_points[0][8] = Point( 26*w/40.0, w/4.0 );
|
||||||
|
rook_points[0][9] = Point( 22*w/40.0, w/4.0 );
|
||||||
|
rook_points[0][10] = Point( 22*w/40.0, w/8.0 );
|
||||||
|
rook_points[0][11] = Point( 18*w/40.0, w/8.0 );
|
||||||
|
rook_points[0][12] = Point( 18*w/40.0, w/4.0 );
|
||||||
|
rook_points[0][13] = Point( 14*w/40.0, w/4.0 );
|
||||||
|
rook_points[0][14] = Point( 14*w/40.0, w/8.0 );
|
||||||
|
rook_points[0][15] = Point( w/4.0, w/8.0 );
|
||||||
|
rook_points[0][16] = Point( w/4.0, 3*w/8.0 );
|
||||||
|
rook_points[0][17] = Point( 13*w/32.0, 3*w/8.0 );
|
||||||
|
rook_points[0][18] = Point( 5*w/16.0, 13*w/16.0 );
|
||||||
|
rook_points[0][19] = Point( w/4.0, 13*w/16.0) ;
|
||||||
|
|
||||||
|
const Point* ppt[1] = { rook_points[0] };
|
||||||
|
int npt[] = { 20 };
|
||||||
|
|
||||||
|
fillPoly( img,
|
||||||
|
ppt,
|
||||||
|
npt,
|
||||||
|
1,
|
||||||
|
Scalar( 255, 255, 255 ),
|
||||||
|
lineType );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function MyLine
|
||||||
|
* @brief Draw a simple line
|
||||||
|
*/
|
||||||
|
void MyLine( Mat img, Point start, Point end )
|
||||||
|
{
|
||||||
|
int thickness = 2;
|
||||||
|
int lineType = 8;
|
||||||
|
line( img,
|
||||||
|
start,
|
||||||
|
end,
|
||||||
|
Scalar( 0, 0, 0 ),
|
||||||
|
thickness,
|
||||||
|
lineType );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
326
samples/cpp/tutorial_code/Basic/Drawing_2.cpp
Normal file
326
samples/cpp/tutorial_code/Basic/Drawing_2.cpp
Normal file
@ -0,0 +1,326 @@
|
|||||||
|
/**
|
||||||
|
* @file Drawing_2.cpp
|
||||||
|
* @brief Simple sample code
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <opencv2/core/core.hpp>
|
||||||
|
#include <opencv2/highgui/highgui.hpp>
|
||||||
|
#include <iostream>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
using namespace cv;
|
||||||
|
|
||||||
|
/// Global Variables
|
||||||
|
const int NUMBER = 100;
|
||||||
|
const int DELAY = 5;
|
||||||
|
|
||||||
|
const int window_width = 900;
|
||||||
|
const int window_height = 600;
|
||||||
|
int x_1 = -window_width/2;
|
||||||
|
int x_2 = window_width*3/2;
|
||||||
|
int y_1 = -window_width/2;
|
||||||
|
int y_2 = window_width*3/2;
|
||||||
|
|
||||||
|
/// Function headers
|
||||||
|
static Scalar randomColor( RNG& rng );
|
||||||
|
int Drawing_Random_Lines( Mat image, char* window_name, RNG rng );
|
||||||
|
int Drawing_Random_Rectangles( Mat image, char* window_name, RNG rng );
|
||||||
|
int Drawing_Random_Ellipses( Mat image, char* window_name, RNG rng );
|
||||||
|
int Drawing_Random_Polylines( Mat image, char* window_name, RNG rng );
|
||||||
|
int Drawing_Random_Filled_Polygons( Mat image, char* window_name, RNG rng );
|
||||||
|
int Drawing_Random_Circles( Mat image, char* window_name, RNG rng );
|
||||||
|
int Displaying_Random_Text( Mat image, char* window_name, RNG rng );
|
||||||
|
int Displaying_Big_End( Mat image, char* window_name, RNG rng );
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function main
|
||||||
|
*/
|
||||||
|
int main( int argc, char** argv )
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
|
||||||
|
/// Start creating a window
|
||||||
|
char window_name[] = "Drawing_2 Tutorial";
|
||||||
|
|
||||||
|
/// Also create a random object (RNG)
|
||||||
|
RNG rng( 0xFFFFFFFF );
|
||||||
|
|
||||||
|
/// Initialize a matrix filled with zeros
|
||||||
|
Mat image = Mat::zeros( window_height, window_width, CV_8UC3 );
|
||||||
|
/// Show it in a window during DELAY ms
|
||||||
|
imshow( window_name, image );
|
||||||
|
waitKey( DELAY );
|
||||||
|
|
||||||
|
/// Now, let's draw some lines
|
||||||
|
c = Drawing_Random_Lines(image, window_name, rng);
|
||||||
|
if( c != 0 ) return 0;
|
||||||
|
|
||||||
|
/// Go on drawing, this time nice rectangles
|
||||||
|
c = Drawing_Random_Rectangles(image, window_name, rng);
|
||||||
|
if( c != 0 ) return 0;
|
||||||
|
|
||||||
|
/// Draw some ellipses
|
||||||
|
c = Drawing_Random_Ellipses( image, window_name, rng );
|
||||||
|
if( c != 0 ) return 0;
|
||||||
|
|
||||||
|
/// Now some polylines
|
||||||
|
c = Drawing_Random_Polylines( image, window_name, rng );
|
||||||
|
if( c != 0 ) return 0;
|
||||||
|
|
||||||
|
/// Draw filled polygons
|
||||||
|
c = Drawing_Random_Filled_Polygons( image, window_name, rng );
|
||||||
|
if( c != 0 ) return 0;
|
||||||
|
|
||||||
|
/// Draw circles
|
||||||
|
c = Drawing_Random_Circles( image, window_name, rng );
|
||||||
|
if( c != 0 ) return 0;
|
||||||
|
|
||||||
|
/// Display text in random positions
|
||||||
|
c = Displaying_Random_Text( image, window_name, rng );
|
||||||
|
if( c != 0 ) return 0;
|
||||||
|
|
||||||
|
/// Displaying the big end!
|
||||||
|
c = Displaying_Big_End( image, window_name, rng );
|
||||||
|
if( c != 0 ) return 0;
|
||||||
|
|
||||||
|
waitKey(0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Function definitions
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function randomColor
|
||||||
|
* @brief Produces a random color given a random object
|
||||||
|
*/
|
||||||
|
static Scalar randomColor( RNG& rng )
|
||||||
|
{
|
||||||
|
int icolor = (unsigned) rng;
|
||||||
|
return Scalar( icolor&255, (icolor>>8)&255, (icolor>>16)&255 );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function Drawing_Random_Lines
|
||||||
|
*/
|
||||||
|
int Drawing_Random_Lines( Mat image, char* window_name, RNG rng )
|
||||||
|
{
|
||||||
|
int lineType = 8;
|
||||||
|
Point pt1, pt2;
|
||||||
|
|
||||||
|
for( int i = 0; i < NUMBER; i++ )
|
||||||
|
{
|
||||||
|
pt1.x = rng.uniform( x_1, x_2 );
|
||||||
|
pt1.y = rng.uniform( y_1, y_2 );
|
||||||
|
pt2.x = rng.uniform( x_1, x_2 );
|
||||||
|
pt2.y = rng.uniform( y_1, y_2 );
|
||||||
|
|
||||||
|
line( image, pt1, pt2, randomColor(rng), rng.uniform(1, 10), 8 );
|
||||||
|
imshow( window_name, image );
|
||||||
|
if( waitKey( DELAY ) >= 0 )
|
||||||
|
{ return -1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function Drawing_Rectangles
|
||||||
|
*/
|
||||||
|
int Drawing_Random_Rectangles( Mat image, char* window_name, RNG rng )
|
||||||
|
{
|
||||||
|
Point pt1, pt2;
|
||||||
|
int lineType = 8;
|
||||||
|
int thickness = rng.uniform( -3, 10 );
|
||||||
|
|
||||||
|
for( int i = 0; i < NUMBER; i++ )
|
||||||
|
{
|
||||||
|
pt1.x = rng.uniform( x_1, x_2 );
|
||||||
|
pt1.y = rng.uniform( y_1, y_2 );
|
||||||
|
pt2.x = rng.uniform( x_1, x_2 );
|
||||||
|
pt2.y = rng.uniform( y_1, y_2 );
|
||||||
|
|
||||||
|
rectangle( image, pt1, pt2, randomColor(rng), MAX( thickness, -1 ), lineType );
|
||||||
|
|
||||||
|
imshow( window_name, image );
|
||||||
|
if( waitKey( DELAY ) >= 0 )
|
||||||
|
{ return -1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function Drawing_Random_Ellipses
|
||||||
|
*/
|
||||||
|
int Drawing_Random_Ellipses( Mat image, char* window_name, RNG rng )
|
||||||
|
{
|
||||||
|
int lineType = 8;
|
||||||
|
|
||||||
|
for ( int i = 0; i < NUMBER; i++ )
|
||||||
|
{
|
||||||
|
Point center;
|
||||||
|
center.x = rng.uniform(x_1, x_2);
|
||||||
|
center.y = rng.uniform(y_1, y_2);
|
||||||
|
|
||||||
|
Size axes;
|
||||||
|
axes.width = rng.uniform(0, 200);
|
||||||
|
axes.height = rng.uniform(0, 200);
|
||||||
|
|
||||||
|
double angle = rng.uniform(0, 180);
|
||||||
|
|
||||||
|
ellipse( image, center, axes, angle, angle - 100, angle + 200,
|
||||||
|
randomColor(rng), rng.uniform(-1,9), lineType );
|
||||||
|
|
||||||
|
imshow( window_name, image );
|
||||||
|
|
||||||
|
if( waitKey(DELAY) >= 0 )
|
||||||
|
{ return -1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function Drawing_Random_Polylines
|
||||||
|
*/
|
||||||
|
int Drawing_Random_Polylines( Mat image, char* window_name, RNG rng )
|
||||||
|
{
|
||||||
|
int lineType = 8;
|
||||||
|
|
||||||
|
for( int i = 0; i< NUMBER; i++ )
|
||||||
|
{
|
||||||
|
Point pt[2][3];
|
||||||
|
pt[0][0].x = rng.uniform(x_1, x_2);
|
||||||
|
pt[0][0].y = rng.uniform(y_1, y_2);
|
||||||
|
pt[0][1].x = rng.uniform(x_1, x_2);
|
||||||
|
pt[0][1].y = rng.uniform(y_1, y_2);
|
||||||
|
pt[0][2].x = rng.uniform(x_1, x_2);
|
||||||
|
pt[0][2].y = rng.uniform(y_1, y_2);
|
||||||
|
pt[1][0].x = rng.uniform(x_1, x_2);
|
||||||
|
pt[1][0].y = rng.uniform(y_1, y_2);
|
||||||
|
pt[1][1].x = rng.uniform(x_1, x_2);
|
||||||
|
pt[1][1].y = rng.uniform(y_1, y_2);
|
||||||
|
pt[1][2].x = rng.uniform(x_1, x_2);
|
||||||
|
pt[1][2].y = rng.uniform(y_1, y_2);
|
||||||
|
|
||||||
|
const Point* ppt[2] = {pt[0], pt[1]};
|
||||||
|
int npt[] = {3, 3};
|
||||||
|
|
||||||
|
polylines(image, ppt, npt, 2, true, randomColor(rng), rng.uniform(1,10), lineType);
|
||||||
|
|
||||||
|
imshow( window_name, image );
|
||||||
|
if( waitKey(DELAY) >= 0 )
|
||||||
|
{ return -1; }
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function Drawing_Random_Filled_Polygons
|
||||||
|
*/
|
||||||
|
int Drawing_Random_Filled_Polygons( Mat image, char* window_name, RNG rng )
|
||||||
|
{
|
||||||
|
int lineType = 8;
|
||||||
|
|
||||||
|
for ( int i = 0; i < NUMBER; i++ )
|
||||||
|
{
|
||||||
|
Point pt[2][3];
|
||||||
|
pt[0][0].x = rng.uniform(x_1, x_2);
|
||||||
|
pt[0][0].y = rng.uniform(y_1, y_2);
|
||||||
|
pt[0][1].x = rng.uniform(x_1, x_2);
|
||||||
|
pt[0][1].y = rng.uniform(y_1, y_2);
|
||||||
|
pt[0][2].x = rng.uniform(x_1, x_2);
|
||||||
|
pt[0][2].y = rng.uniform(y_1, y_2);
|
||||||
|
pt[1][0].x = rng.uniform(x_1, x_2);
|
||||||
|
pt[1][0].y = rng.uniform(y_1, y_2);
|
||||||
|
pt[1][1].x = rng.uniform(x_1, x_2);
|
||||||
|
pt[1][1].y = rng.uniform(y_1, y_2);
|
||||||
|
pt[1][2].x = rng.uniform(x_1, x_2);
|
||||||
|
pt[1][2].y = rng.uniform(y_1, y_2);
|
||||||
|
|
||||||
|
const Point* ppt[2] = {pt[0], pt[1]};
|
||||||
|
int npt[] = {3, 3};
|
||||||
|
|
||||||
|
fillPoly( image, ppt, npt, 2, randomColor(rng), lineType );
|
||||||
|
|
||||||
|
imshow( window_name, image );
|
||||||
|
if( waitKey(DELAY) >= 0 )
|
||||||
|
{ return -1; }
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function Drawing_Random_Circles
|
||||||
|
*/
|
||||||
|
int Drawing_Random_Circles( Mat image, char* window_name, RNG rng )
|
||||||
|
{
|
||||||
|
int lineType = 8;
|
||||||
|
|
||||||
|
for (int i = 0; i < NUMBER; i++)
|
||||||
|
{
|
||||||
|
Point center;
|
||||||
|
center.x = rng.uniform(x_1, x_2);
|
||||||
|
center.y = rng.uniform(y_1, y_2);
|
||||||
|
|
||||||
|
circle( image, center, rng.uniform(0, 300), randomColor(rng),
|
||||||
|
rng.uniform(-1, 9), lineType );
|
||||||
|
|
||||||
|
imshow( window_name, image );
|
||||||
|
if( waitKey(DELAY) >= 0 )
|
||||||
|
{ return -1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function Displaying_Random_Text
|
||||||
|
*/
|
||||||
|
int Displaying_Random_Text( Mat image, char* window_name, RNG rng )
|
||||||
|
{
|
||||||
|
int lineType = 8;
|
||||||
|
|
||||||
|
for ( int i = 1; i < NUMBER; i++ )
|
||||||
|
{
|
||||||
|
Point org;
|
||||||
|
org.x = rng.uniform(x_1, x_2);
|
||||||
|
org.y = rng.uniform(y_1, y_2);
|
||||||
|
|
||||||
|
putText( image, "Testing text rendering", org, rng.uniform(0,8),
|
||||||
|
rng.uniform(0,100)*0.05+0.1, randomColor(rng), rng.uniform(1, 10), lineType);
|
||||||
|
|
||||||
|
imshow( window_name, image );
|
||||||
|
if( waitKey(DELAY) >= 0 )
|
||||||
|
{ return -1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function Displaying_Big_End
|
||||||
|
*/
|
||||||
|
int Displaying_Big_End( Mat image, char* window_name, RNG rng )
|
||||||
|
{
|
||||||
|
Size textsize = getTextSize("OpenCV forever!", CV_FONT_HERSHEY_COMPLEX, 3, 5, 0);
|
||||||
|
Point org((window_width - textsize.width)/2, (window_height - textsize.height)/2);
|
||||||
|
int lineType = 8;
|
||||||
|
|
||||||
|
Mat image2;
|
||||||
|
|
||||||
|
for( int i = 0; i < 255; i += 2 )
|
||||||
|
{
|
||||||
|
image2 = image - Scalar::all(i);
|
||||||
|
putText( image2, "OpenCV forever!", org, CV_FONT_HERSHEY_COMPLEX, 3,
|
||||||
|
Scalar(i, i, 255), 5, lineType );
|
||||||
|
|
||||||
|
imshow( window_name, image2 );
|
||||||
|
if( waitKey(DELAY) >= 0 )
|
||||||
|
{ return -1; }
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
52
samples/cpp/tutorial_code/Basic/LoadSaveImage.cpp
Normal file
52
samples/cpp/tutorial_code/Basic/LoadSaveImage.cpp
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/**
|
||||||
|
* @file LoadSaveImage.cpp
|
||||||
|
* @brief Sample code that load an image, modify it and save the new image.
|
||||||
|
* @author OpenCV team
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cv.h>
|
||||||
|
#include <highgui.h>
|
||||||
|
|
||||||
|
using namespace cv;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function main
|
||||||
|
* @brief Self-explanatory
|
||||||
|
*/
|
||||||
|
int main( int argc, char** argv )
|
||||||
|
{
|
||||||
|
/// Get the name of the file to be loaded
|
||||||
|
char* imageName = argv[1];
|
||||||
|
|
||||||
|
/// Create a Mat object
|
||||||
|
Mat image;
|
||||||
|
|
||||||
|
/// Load the image using imread
|
||||||
|
image = imread( imageName, 1 );
|
||||||
|
|
||||||
|
/// Verify that the image was loaded
|
||||||
|
if( argc != 2 || !image.data )
|
||||||
|
{
|
||||||
|
printf( " No image data \n " );
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Change the image to Grayscale
|
||||||
|
Mat gray_image;
|
||||||
|
cvtColor( image, gray_image, CV_RGB2GRAY );
|
||||||
|
|
||||||
|
/// Save our gray image
|
||||||
|
imwrite( "../../images/Gray_Image.png", gray_image );
|
||||||
|
|
||||||
|
/// Create a couple of windows and show our images
|
||||||
|
namedWindow( imageName, CV_WINDOW_AUTOSIZE );
|
||||||
|
namedWindow( "Gray image", CV_WINDOW_AUTOSIZE );
|
||||||
|
|
||||||
|
imshow( imageName, image );
|
||||||
|
imshow( "Gray image", gray_image );
|
||||||
|
|
||||||
|
/// Wait until user finish the application
|
||||||
|
waitKey(0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user