44
4th Computer Vision Workshop February 2011

2nd section

Embed Size (px)

Citation preview

Page 1: 2nd section

4th Computer Vision Workshop

February 2011

Page 2: 2nd section

Content Basic Structures

Arrays, Matrices, and Images

Matrix and Image Operators

Drawing Things

Drawing Text

Page 3: 2nd section

Basic Structures

Page 4: 2nd section

Basic Structures (Point)

typedef struct CvPoint

{

int x;

int y;

} CvPoint;

CV_INLINE CvPoint cvPoint(int x, int y)

{

CvPoint p;

p.x = x;

p.y = y;

return p;

}

CvPoint pt1;

pt1.x = 20;

pt1.y = 50

CvPoint pt2 = cvPoint(20, 50);

cxtypes.h

Page 5: 2nd section

Basic Structures (Point)

typedef struct CvPoint

{

int x;

int y;

} CvPoint;

cxtypes.h

typedef struct CvPoint2D32f

{

float x;

float y;

} CvPoint2D32f;

typedef struct CvPoint2D64f

{

double x;

double y;

} CvPoint2D64f;

typedef struct CvPoint3D32f

{

float x;

float y;

float z;

} CvPoint3D32f;

typedef struct CvPoint3D64f

{

double x;

double y;

double z;

} CvPoint3D64f;

Page 6: 2nd section

Basic Structures (Size)

typedef struct CvSize

{

int width;

int height;

} CvSize;

cxtypes.h

typedef struct CvSize2D32f

{

float width;

float height;

} CvSize2D32f

typedef struct CvRect

{

int x;

int y;

int width;

int height;

} CvRect;

Page 7: 2nd section

Basic Structures (Scalar)

typedef struct CvScalar

{

double val[4];

} CvScalar;

cxtypes.h

/* Constructor:

initializes val[0] with val0, val[1] with val1, etc.

*/

inline CvScalar cvScalar( double val0, double val1=0,

double val2=0, double val3=0 );

/* Constructor:

initializes all of val[0]...val[3] with val0123

*/

inline CvScalar cvScalarAll( double val0123 );

/* Constructor:

initializes val[0] with val0, and all of val[1]...val[3] with zeros

*/

inline CvScalar cvRealScalar( double val0 );

Page 8: 2nd section

Arrays, Matrices, and Images

Page 9: 2nd section

Array → Matrix → Image

cxtypes.h

Even though OpenCV is implemented in C, the structures used in OpenCV

have an object-oriented design; in effect, IplImage is derived from

CvMat, which is derived from CvArr

Page 10: 2nd section

Array→Matrix→Image typedef struct CvMat

{

int type;

int step; //# bytes per row

int* refcount; // internal use

int hdr_refcount; // internal use

union{

uchar* ptr;

short* s;

int* i;

float* fl;

double* db;

} data;

union{

int rows;

int height;

};

union{

int cols;

int width;

};

} CvMat;

cxtypes.h

Page 11: 2nd section

Array → Matrix → Image typedef struct CvMat

{

int type;

int step; //# bytes per row

int* refcount; // internal use

int hdr_refcount; // internal use

union{

uchar* ptr;

short* s;

int* i;

float* fl;

double* db;

} data;

union{

int rows;

int height;

};

union{

int cols;

int width;

};

} CvMat;

cxtypes.h

CV_<bit_depth>(S|U|F)C<number_of_channels>

CV_8UC3

CV_32FC1 32-bit floats

unsigned integer 8-bit triplets

Page 12: 2nd section

Array → Matrix → Image typedef struct CvMat

{

int type;

int step; //# bytes per row

int* refcount; // internal use

int hdr_refcount; // internal use

union{

uchar* ptr;

short* s;

int* i;

float* fl;

double* db;

} data;

union{

int rows;

int height;

};

union{

int cols;

int width;

};

} CvMat;

cxtypes.h

the length of a row in bytes

a pointer to a data array

Page 13: 2nd section

Array → Matrix → Image typedef struct CvMat

{

int type;

int step; //# bytes per row

int* refcount; // internal use

int hdr_refcount; // internal use

union{

uchar* ptr;

short* s;

int* i;

float* fl;

double* db;

} data;

union{

int rows;

int height;

};

union{

int cols;

int width;

};

} CvMat;

cxtypes.h

the height (rows) and width (cols) of the matrix

Page 14: 2nd section

Array → Matrix → Image typedef struct CvMat

{

int type;

int step; //# bytes per row

int* refcount; // internal use

int hdr_refcount; // internal use

union{

uchar* ptr;

short* s;

int* i;

float* fl;

double* db;

} data;

union{

int rows;

int height;

};

union{

int cols;

int width;

};

} CvMat;

cxtypes.h

Matrix Header

Page 15: 2nd section

Array → Matrix → Image typedef struct CvMat

{

int type;

int step; //# bytes per row

int* refcount; // internal use

int hdr_refcount; // internal use

union{

uchar* ptr;

short* s;

int* i;

float* fl;

double* db;

} data;

union{

int rows;

int height;

};

union{

int cols;

int width;

};

} CvMat;

cxtypes.h

Some Matrix Operators: // Create a new rows by cols matrix of type ‘type’

CvMat* cvCreateMat(int rows, int cols, int type)

// Creates only matrix header without allocating data

CvMat* cvCreateMatHeader(int rows, int cols, int type)

// allocates image, matrix or multi-dimensional array data

void cvCreateData(CvArr* arr)

// Initialize header on existing CvMat structure

CvMat* cvInitMatHeader(CvMat* mat,

int rows, int cols, int type,

void* data=NULL, int step=CV_AUTOSTEP)

// Like cvInitMatHeader() but allocates CvMat as well

CvMat cvMat(int rows, int cols, int type, void* data=NULL)

;

// Allocate a new matrix just like the matrix ‘mat’

CvMat* cvCloneMat(const cvMat* mat);

// Free the matrix ‘mat’, both header and data

void cvReleaseMat(CvMat** mat);

Page 16: 2nd section

Array → Matrix → Image typedef struct CvMat

{

int type;

int step; //# bytes per row

int* refcount; // internal use

int hdr_refcount; // internal use

union{

uchar* ptr;

short* s;

int* i;

float* fl;

double* db;

} data;

union{

int rows;

int height;

};

union{

int cols;

int width;

};

} CvMat;

cxtypes.h

Accessing matrix elements

Easy way:

CV_MAT_ELEM()

CV_MAT_ELEM_PTR()

CvMat* mat = cvCreateMat( 5, 5, CV_32FC1 );

int i, j;

float sum = 0.0f;

for(i=0; i<5; i++)

for(j=0; j<5; j++)

CV_MAT_ELEM(*mat, float, i, j) = (float) i + j;

for(i=0; i<5; i++)

for(j=0; j<5; j++)

sum += CV_MAT_ELEM(*mat, float, i, j);

Page 17: 2nd section

Array → Matrix → Image typedef struct CvMat

{

int type;

int step; //# bytes per row

int* refcount; // internal use

int hdr_refcount; // internal use

union{

uchar* ptr;

short* s;

int* i;

float* fl;

double* db;

} data;

union{

int rows;

int height;

};

union{

int cols;

int width;

};

} CvMat;

cxtypes.h

Accessing matrix elements

Easy way:

CV_MAT_ELEM()

CV_MAT_ELEM_PTR()

CvMat* mat = cvCreateMat( 5, 5, CV_32FC1 );

int i, j;

float sum = 0.0f;

for(i=0; i<5; i++)

for(j=0; j<5; j++)

*((float*) CV_MAT_ELEM_PTR(*mat, i, j)) = (float) i + j;

for(i=0; i<5; i++)

for(j=0; j<5; j++)

sum += *((float*) CV_MAT_ELEM_PTR(*mat, i, j)) ;

Page 18: 2nd section

Array → Matrix → Image

typedef struct _IplImage {

int nSize;

int ID;

int nChannels;

int alphaChannel;

int depth;

char colorModel[4];

char channelSeq[4];

int dataOrder;

int origin;

int align;

int width;

int height;

struct _IplROI* roi;

struct _IplImage* maskROI;

void* imageId;

struct _IplTileInfo* tileInfo;

int imageSize;

char* imageData;

int widthStep;

int BorderMode[4];

int BorderConst[4];

char* imageDataOrigin;

} IplImage;

Page 19: 2nd section

Array → Matrix → Image

typedef struct _IplImage {

int nSize;

int ID;

int nChannels;

int alphaChannel;

int depth;

char colorModel[4];

char channelSeq[4];

int dataOrder;

int origin;

int align;

int width;

int height;

struct _IplROI* roi;

struct _IplImage* maskROI;

void* imageId;

struct _IplTileInfo* tileInfo;

int imageSize;

char* imageData;

int widthStep;

int BorderMode[4];

int BorderConst[4];

char* imageDataOrigin;

} IplImage;

• nSize - sizeof(IplImage)

• ID - Version, always equals 0

• nChannels - Number of channels. Most OpenCV functions support 1-4 channels.

• alphaChannel - Ignored by OpenCV

• depth - Pixel depth in bits. The supported depths are:

IPL_DEPTH_8U - Unsigned 8-bit integer

IPL_DEPTH_8S - Signed 8-bit integer

IPL_DEPTH_16U - Unsigned 16-bit integer

IPL_DEPTH_16S - Signed 16-bit integer

IPL_DEPTH_32S - Signed 32-bit integer

IPL_DEPTH_32F - Single-precision floating point

IPL_DEPTH_64F - Double-precision floating point

Page 20: 2nd section

Array → Matrix → Image

typedef struct _IplImage {

int nSize;

int ID;

int nChannels;

int alphaChannel;

int depth;

char colorModel[4];

char channelSeq[4];

int dataOrder;

int origin;

int align;

int width;

int height;

struct _IplROI* roi;

struct _IplImage* maskROI;

void* imageId;

struct _IplTileInfo* tileInfo;

int imageSize;

char* imageData;

int widthStep;

int BorderMode[4];

int BorderConst[4];

char* imageDataOrigin;

} IplImage;

• colorModel - Ignored by OpenCV.

• channelSeq - Ignored by OpenCV

• dataOrder - 0 = IPL_DATA_ORDER_PIXEL

1 = IPL_DATA_ORDER_PLANE

• origin - 0 = IPL_ORIGIN_TL

1 = IPL_ORIGIN_BL

• align - OpenCV ignores this and uses widthStep instead.

• width - Image width in pixels

• height - Image height in pixels

Page 21: 2nd section

Array → Matrix → Image

typedef struct _IplImage {

int nSize;

int ID;

int nChannels;

int alphaChannel;

int depth;

char colorModel[4];

char channelSeq[4];

int dataOrder;

int origin;

int align;

int width;

int height;

struct _IplROI* roi;

struct _IplImage* maskROI;

void* imageId;

struct _IplTileInfo* tileInfo;

int imageSize;

char* imageData;

int widthStep;

int BorderMode[4];

int BorderConst[4];

char* imageDataOrigin;

} IplImage;

• roi - Region Of Interest (ROI).

If not NULL, only this image region will be processed.

• maskROI - Must be NULL in OpenCV

• imageId - Must be NULL in OpenCV

• tileInfo - Must be NULL in OpenCV

Page 22: 2nd section

Array → Matrix → Image

typedef struct _IplImage {

int nSize;

int ID;

int nChannels;

int alphaChannel;

int depth;

char colorModel[4];

char channelSeq[4];

int dataOrder;

int origin;

int align;

int width;

int height;

struct _IplROI* roi;

struct _IplImage* maskROI;

void* imageId;

struct _IplTileInfo* tileInfo;

int imageSize;

char* imageData;

int widthStep;

int BorderMode[4];

int BorderConst[4];

char* imageDataOrigin;

} IplImage;

• imageSize - Image data size in bytes.

For interleaved data, this equals image->height*image->widthStep

• imageData - A pointer to the aligned image data

• widthStep - The size of an aligned image row, in bytes

• BorderMode - Border completion mode, ignored by OpenCV

• BorderConst - Border completion mode, ignored by OpenCV

• imageDataOrigin - A pointer to the origin of the image data

(not necessarily aligned). This is used for

image deallocation.

Page 23: 2nd section

Accessing Image Data

typedef struct _IplImage {

int nSize;

int ID;

int nChannels;

int alphaChannel;

int depth;

char colorModel[4];

char channelSeq[4];

int dataOrder;

int origin;

int align;

int width;

int height;

struct _IplROI* roi;

struct _IplImage* maskROI;

void* imageId;

struct _IplTileInfo* tileInfo;

int imageSize;

char* imageData;

int widthStep;

int BorderMode[4];

int BorderConst[4];

char* imageDataOrigin;

} IplImage;

#include <stdio.h>

#include <cv.h>

#include <highgui.h>

void saturate_sv( IplImage* img )

{

for( int y=0; y<img->height; y++ ) {

uchar* ptr = (uchar*) (

img->imageData + y * img->widthStep

);

for( int x=0; x<img->width; x++ ) {

ptr[3*x+1] = 255;

ptr[3*x+2] = 255;

}

}

}

int main( int argc, char** argv )

{

IplImage* img = cvLoadImage( argv[1] );

cvNamedWindow("Example1", CV_WINDOW_AUTOSIZE );

saturate_sv(img);

cvShowImage("Example1", img );

cvWaitKey(0);

cvReleaseImage( &img );

cvDestroyWindow("Example1");

}

Page 24: 2nd section

ROI

typedef struct _IplImage {

........................

int width;

int height;

........................

struct _IplROI* roi;

........................

char* imageData;

int widthStep;

........................

} IplImage;

void cvSetImageROI( IplImage* image, CvRect rect );

void cvResetImageROI( IplImage* image );

cvSetImageROI

Page 25: 2nd section

ROI

typedef struct _IplImage {

........................

int width;

int height;

........................

struct _IplROI* roi;

........................

char* imageData;

int widthStep;

........................

} IplImage;

void cvSetImageROI( IplImage* image, CvRect rect );

void cvResetImageROI( IplImage* image );

cvSetImageROI

cvAddS

Page 26: 2nd section

ROI

typedef struct _IplImage {

........................

int width;

int height;

........................

struct _IplROI* roi;

........................

char* imageData;

int widthStep;

........................

} IplImage;

void cvSetImageROI( IplImage* image, CvRect rect );

void cvResetImageROI( IplImage* image );

cvSetImageROI

cvAddS

#include <cv.h>

#include <highgui.h>

// ch3_ex3_12 image_name x y width height add#

int main(int argc, char** argv)

{

IplImage* src;

cvNamedWindow("Example3_12_pre", CV_WINDOW_AUTOSIZE);

cvNamedWindow("Example3_12_post", CV_WINDOW_AUTOSIZE);

if( argc == 7 && ((src=cvLoadImage(argv[1],1)) != 0 ))

{

int x = atoi(argv[2]);

int y = atoi(argv[3]);

int width = atoi(argv[4]);

int height = atoi(argv[5]);

int add = atoi(argv[6]);

cvShowImage( "Example3_12_pre", src);

cvSetImageROI(src, cvRect(x,y,width,height));

cvAddS(src, cvScalar(add, add, add),src);

cvResetImageROI(src);

cvShowImage( "Example3_12_post",src);

cvWaitKey();

}

cvReleaseImage( &src );

cvDestroyWindow("Example3_12_pre");

cvDestroyWindow("Example3_12_post");

return 0;

}

Page 27: 2nd section

Drawing Things

Page 28: 2nd section

Drawing Functions

Drawing functions work with matrices/images of arbitrary depth

The boundaries of the shapes can be rendered with antialiasing implemented only for 8-bit images for now

All the functions include the parameter color that uses a rgb value (that may be constructed with CV_RGB macro or the cvScalar function ) for color images and brightness for grayscale images

Page 29: 2nd section

Drawing Functions

Clipping If a drawn figure is partially or completely outside the

image, the drawing functions clip it.

sub-pixel accuracy many drawing functions can handle pixel coordinates

specified with sub-pixel accuracy, i.e., the coordinates can be passed as fixed-point numbers, encoded as integers.

The number of fractional bits is specified by the shift parameter and the real point coordinates are calculated as

Point( , ) Point2f ( 2 , 2 )shift shiftx y x y

Page 30: 2nd section

CV_RGB

Constructs a color value #define CV_RGB( r, g, b ) cvScalar( (b), (g), (r) )

Page 31: 2nd section

Line

void cvLine(

CvArr* img,

CvPoint pt1,

CvPoint pt2,

CvScalar color,

int thickness=1,

int line_type=8,

int shift=0

);

Draws a line by the Bresenham’s algorithm

Page 32: 2nd section

Rectangle

void cvRectangle(

CvArr* img,

CvPoint pt1,

CvPoint pt2,

double color,

int thickness=1

int line_type=8,

int shift=0

);

Draws simple, thick or filled rectangle

thickness

Thickness of lines that make up the rectangle. Negative values, e.g., CV_FILLED, make the function to draw a filled rectangle.

Page 33: 2nd section

Circle

void cvCircle(

CvArr* img,

CvPoint center,

int radius,

cvScalar color,

int thickness=1

int line_type=8,

int shift=0

);

Draws simple, thick or filled circle

Page 34: 2nd section

Ellipse

void cvEllipse(

CvArr* img,

CvPoint center,

CvSize axes,

double angle,

double start_angle,

double end_angle,

cvScalar color,

int thickness=1

int line_type=8,

int shift=0

);

Draws simple or thick elliptic arc or fills ellipse sector

Page 35: 2nd section

EllipseBox

void cvEllipseBox(

CvArr* img,

CvBox2D box,

cvScalar color,

int thickness=1

int line_type=8,

int shift=0

);

An alternate way to draw ellipse

typedef struct {

CvPoint2D32f center;

CvSize2D32f size;

float angle;

} CvBox2D;

Page 36: 2nd section

FillPoly

void cvFillPoly(

CvArr* img,

CvPoint** pts,

int* npts,

int contours,

cvScalar color,

int line_type=8,

int shift=0

);

Fills polygons interior

pts

Array of pointers to polygons.

npts

Array of polygon vertex counters.

contours

#contours that bind the filled region.

Page 37: 2nd section

FillConvexPoly

void cvFillConvexPoly(

CvArr* img,

CvPoint* pts,

int npts,

cvScalar color,

int thickness=1

int line_type=8,

int shift=0

);

Fills convex polygon

pts

Array of pointers to a single polygon

npts

Polygon vertex counter

Page 38: 2nd section

PolyLine

void cvPolyLine(

CvArr* img,

CvPoint** pts,

int* npts,

int contours,

int is_closed,

cvScalar color,

int thickness=1

int line_type=8,

int shift=0

);

Draws simple or thick polygons

pts

Array of pointers to polygons.

npts

Array of polygon vertex counters.

contours

#contours that bind the filled region.

is_closed

Indicates whether the polylines must

be drawn closed.

Page 39: 2nd section

Drawing Text

Page 40: 2nd section

InitFont

void cvInitFont(

CvFont* font,

int font_face,

double hscale,

double vscale,

double shear=0,

int thickness=1,

int line_type=8

);

Initializes font structure

Page 41: 2nd section

InitFont

void cvInitFont(

CvFont* font,

int font_face,

double hscale,

double vscale,

double shear=0,

int thickness=1,

int line_type=8

);

Initializes font structure

Page 42: 2nd section

InitFont

void cvInitFont(

CvFont* font,

int font_face,

double hscale,

double vscale,

double shear=0,

int thickness=1,

int line_type=8

);

Initializes font structure

Page 43: 2nd section

PutText

void cvPutText(

CvArr* img,

const char* text,

CvPoint org,

const CvFont* font,

CvScalar color

);

Draws text string

Page 44: 2nd section

GetTextSize

void cvGetTextSize(

const char* text_string,

const CvFont* font,

CvSize* text_size,

int* baseline

);

Retrieves width and height of text string