9. 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
10. 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
11. 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
12. 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
13. 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
14. 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
15. 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);
16. 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);
17. 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)) ;
18. 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;
19. 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
20. 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
21. 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
22. 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.
23. 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");
}
24. 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
25. 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
26. 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;
}
28. 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
29. 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 shift
x y x y
31. 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
32. 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.
34. 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
35. 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;
36. 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.
38. 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.