[OpenCV] Basic data types - Matrix
Ref: http://docs.opencv.org/2.4.13/
基础数据结构
一、基本几何
矩形
"modules/core/src/drawing.cpp"
CV_IMPL void
cvRectangle( CvArr* _img, CvPoint pt1, CvPoint pt2,
CvScalar color, int thickness,
int line_type, int shift )
{
cv::Mat img = cv::cvarrToMat(_img);
cv::rectangle( img, pt1, pt2, color, thickness, line_type, shift );
}
点
"modules/core/include/opencv2/core/types_c.h"
typedef struct CvPoint
{
int x;
int y;
}
CvPoint;
typedef struct CvPoint3D64f
{
double x;
double y;
double z;
}
CvPoint3D64f;
面积
typedef struct CvSize
{
int width;
int height;
}
CvSize;
大数表示 (例如:表示颜色)
typedef struct CvScalar
{
double val[];
}
CvScalar;
二、矩阵描述
- Mat
Ref: opencv基础知识------IplImage, CvMat, Mat 的关系和相互转换
在openCV中,Mat类型与CvMat和IplImage类型都可以代表和显示图像,
但是,Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化。
而CvMat和IplImage类型更侧重于“图像”,openCV对其中的图像操作(缩放、单通道提取、图像阈值操作等)进行了优化。
补充:
IplImage由CvMat派生,而CvMat由CvArr派生即CvArr -> CvMat -> IplImage
CvArr用作函数的参数,无论传入的是CvMat或IplImage,内部都是按CvMat处理。
三、图片描述
- IplImage
"modules/core/include/opencv2/core/types_c.h"
typedef struct _IplImage
{
int nSize; /* sizeof(IplImage) */
int ID; /* version (=0)*/
int nChannels; /* Most of OpenCV functions support 1,2,3 or 4 channels */
int alphaChannel; /* Ignored by OpenCV */
int depth; /* Pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S,
IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported. */
char colorModel[]; /* Ignored by OpenCV */
char channelSeq[]; /* ditto */
int dataOrder; /* 0 - interleaved color channels 隔行扫描, 1 - separate color channels .
cvCreateImage can only create images */
int origin; /* 0 - top-left origin,
1 - bottom-left origin (Windows bitmaps style). */
int align; /* Alignment of image rows (4 or 8).
OpenCV ignores it and uses widthStep instead. */
int width; /* Image width in pixels. */
int height; /* Image height in pixels. */
struct _IplROI *roi; /* Image ROI. If NULL, the whole image is selected. */
struct _IplImage *maskROI; /* Must be NULL. */
void *imageId; /* " " */
struct _IplTileInfo *tileInfo; /* " " */
int imageSize; /* Image data size in bytes
(==image->height*image->widthStep
in case of interleaved data)*/
char *imageData; /* Pointer to aligned image data. */
int widthStep; /* Size of aligned image row in bytes. */
int BorderMode[]; /* Ignored by OpenCV. */
int BorderConst[]; /* Ditto. */
char *imageDataOrigin; /* Pointer to very origin of image data
(not necessarily aligned) -
needed for correct deallocation */
}
IplImage;
- CvMat
"modules/core/include/opencv2/core/types_c.h" 708L, 58287C
typedef struct CvMat
{
int type;
int step; /* for internal use only */
int* refcount;
int hdr_refcount; union
{
uchar*;
short* s;
int* i;
float* fl;
double* db;
} data; #ifdef __cplusplus
union
{
int rows;
int height;
}; union
{
int cols;
int width;
};
#else
int rows;
int cols;
#endif }
CvMat;
[1] 初始化一个矩阵
#include "cv.h"
#include <stdio.h> int main()
{
// Create an OpenCV Matrix containing some fixed data.
//
float vals[] = { 0.866025, -0.500000, 0.500000, 0.866025}; CvMat rotmat; cvInitMatHeader(&rotmat, , , CV_32FC1, vals);
printf("Ex 3_3 matrix initialized\n");
}
[2] 相关源代码:"modules/core/src/array.cpp"
[3] 初始化细节:Init Matrax ( ):
CV_IMPL CvMat*
cvInitMatHeader( CvMat* arr, int rows, int cols,
int type, void* data, int step )
{
if( !arr )
CV_Error( CV_StsNullPtr, "" ); if( (unsigned)CV_MAT_DEPTH(type) > CV_DEPTH_MAX )
CV_Error( CV_BadNumChannels, "" ); if( rows < || cols <= )
CV_Error( CV_StsBadSize, "Non-positive cols or rows" ); type = CV_MAT_TYPE( type );
arr->type = type | CV_MAT_MAGIC_VAL;
arr->rows = rows;
arr->cols = cols;
arr->data.ptr = (uchar*)data;
arr->refcount = ;
arr->hdr_refcount = ; int pix_size = CV_ELEM_SIZE(type);
int min_step = arr->cols*pix_size; if( step != CV_AUTOSTEP && step != )
{
if( step < min_step )
CV_Error( CV_BadStep, "" );
arr->step = step;
}
else
{
arr->step = min_step;
} arr->type = CV_MAT_MAGIC_VAL | type |
(arr->rows == || arr->step == min_step ? CV_MAT_CONT_FLAG : ); icvCheckHuge( arr );
return arr;
}
[4] 其他相关API:Relevant Functions
// Create a new rows by cols matrix of type ‘type’.
//
CvMat* cvCreateMat( int rows, int cols, int type );
// Create only matrix header without allocating data
//
CvMat* cvCreateMatHeader( int rows, int cols, int type );
// 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 );
四、存取像素点
- 宏方法
"modules/core/include/opencv2/core/types_c.h"
#define CV_MAT_ELEM_PTR_FAST( mat, row, col, pix_size ) \
(assert( (unsigned)(row) < (unsigned)(mat).rows && \
(unsigned)(col) < (unsigned)(mat).cols ), \
(mat).data.ptr + (size_t)(mat).step*(row) + (pix_size)*(col)) #define CV_MAT_ELEM_PTR( mat, row, col ) \
CV_MAT_ELEM_PTR_FAST( mat, row, col, CV_ELEM_SIZE((mat).type) ) #define CV_MAT_ELEM( mat, elemtype, row, col ) \
(*(elemtype*)CV_MAT_ELEM_PTR_FAST( mat, row, col, sizeof(elemtype)))
宏取值,简单但通用性不强:
#include "cv.h"
#include <stdio.h> int main()
{
CvMat* mat = cvCreateMat( , , CV_32FC1 );
// 1. 指针法
float element_3_2 = 7.7;
*( (float*)CV_MAT_ELEM_PTR( *mat, , ) ) = element_3_2; // 2. 处理“浮点型,单通道矩阵”
cvmSet( mat, , , 0.5000 ); // 3. 较常用
cvSetReal2D( mat, , , 0.3300 ); printf("Exercise 3_5, matrix created and accessed [3,2]=%f, [2,2]=%f, [3,3]=%f\n",
CV_MAT_ELEM( *mat, float, , ),
CV_MAT_ELEM( *mat, float, , ),
CV_MAT_ELEM( *mat, float, , ) );
}
- Get pixel
"modules/core/src/array.cpp"
// CvMat and IplImage element functions
double cvGetReal1D( const CvArr* arr, int idx0 );
double cvGetReal2D( const CvArr* arr, int idx0, int idx1 );
double cvGetReal3D( const CvArr* arr, int idx0, int idx1, int idx2 );
double cvGetRealND( const CvArr* arr, int* idx );
CvScalar cvGet1D( const CvArr* arr, int idx0 );
CvScalar cvGet2D( const CvArr* arr, int idx0, int idx1 );
CvScalar cvGet3D( const CvArr* arr, int idx0, int idx1, int idx2 );
CvScalar cvGetND( const CvArr* arr, int* idx );
返回值类型占用空间大,也有小的方案 as following:
// Pointer access to matrix structures
uchar* cvPtr1D(
const CvArr* arr,
int idx0,
int* type = NULL
);
uchar* cvPtr2D(
const CvArr* arr,
int idx0,
int idx1,
int* type = NULL
);
uchar* cvPtr3D(
const CvArr* arr,
int idx0,
int idx1,
int idx2,
int* type = NULL
);
uchar* cvPtrND(
const CvArr* arr,
int* idx,
int* type = NULL,
int create_node = ,
unsigned* precalc_hashval = NULL
);
- Set Pixel
// Set element functions for CvMat or IplImage.
void cvSetReal1D( CvArr* arr, int idx0, double value );
void cvSetReal2D( CvArr* arr, int idx0, int idx1, double value );
void cvSetReal3D(
CvArr* arr,
int idx0,
int idx1,
int idx2,
double value
);
void cvSetRealND( CvArr* arr, int* idx, double value );
void cvSet1D( CvArr* arr, int idx0, CvScalar value );
void cvSet2D( CvArr* arr, int idx0, int idx1, CvScalar value );
void cvSet3D(
CvArr* arr,
int idx0,
int idx1,
int idx2,
CvScalar value
);
void cvSetND( CvArr* arr, int* idx, CvScalar value );
- 综合性例子
/* License:
Oct. 3, 2008
Right to use this code in any way you want without warrenty, support or any guarentee of it working. BOOK: It would be nice if you cited it:
Learning OpenCV: Computer Vision with the OpenCV Library
by Gary Bradski and Adrian Kaehler
Published by O'Reilly Media, October 3, 2008 AVAILABLE AT:
http://www.amazon.com/Learning-OpenCV-Computer-Vision-Library/dp/0596516134
Or: http://oreilly.com/catalog/9780596516130/
ISBN-10: 0596516134 or: ISBN-13: 978-0596516130 OTHER OPENCV SITES:
* The source code is on sourceforge at:
http://sourceforge.net/projects/opencvlibrary/
* The OpenCV wiki page (As of Oct 1, 2008 this is down for changing over servers, but should come back):
http://opencvlibrary.sourceforge.net/
* An active user group is at:
http://tech.groups.yahoo.com/group/OpenCV/
* The minutes of weekly OpenCV development meetings are at:
http://pr.willowgarage.com/wiki/OpenCV
*/ #include <stdio.h>
#include <cv.h>
#include <highgui.h> float sum( CvMat* mat ) {
float s = 0.0f;
for( int row=; row<mat->height; row++ ) {
float* ptr = mat->data.fl + row * mat->step/;
for( int col=; col<mat->width; col++ ) {
s += *ptr++;
}
}
return( s );
}; int main(int argc, char** argv)
{
CvMat *mat = cvCreateMat(,,CV_32FC1);
float element_3_2 = 7.7;
*((float*)CV_MAT_ELEM_PTR( *mat, ,) ) = element_3_2;
cvmSet(mat,,,0.5000);
cvSetReal2D(mat,,,0.5000);
float s = sum(mat);
printf("%f\n",s);
return ;
}
[OpenCV] Basic data types - Matrix的更多相关文章
- Basic SAP Data Types
Basic SAP Data Types 6 out of 11 rated this helpful - Rate this topic The parameter types that the M ...
- Core Java Volume I — 3.3. Data Types
3.3. Data TypesJava is a strongly typed language(强类型语音). This means that every variable must have a ...
- Data Types
原地址: Home / Database / Oracle Database Online Documentation 11g Release 2 (11.2) / Database Administ ...
- 一、spark 数据类型(Data Types)
Data Types - MLlib(数据类型) MLlib支持存储在单机上的局部向量和局部矩阵,也可以支持通过一个或多个RDD(可伸缩数据集)表示的分布式矩阵.局部向量和局部矩阵是用作公 ...
- 【12c】扩展数据类型(Extended Data Types)-- MAX_STRING_SIZE
[12c]扩展数据类型(Extended Data Types)-- MAX_STRING_SIZE 在12c中,与早期版本相比,诸如VARCHAR2, NAVARCHAR2以及 RAW这些数据类型的 ...
- Oracle Schema Objects——Tables——Oracle Data Types
Oracle Schema Objects Oracle Data Types 数据类型 Data Type Description NUMBER(P,S) Number value having a ...
- C and SQL data types for ODBC and CLI
C and SQL data types for ODBC and CLI This topic lists the C and SQL data types for ODBC and CLI a ...
- allow zero datetime=true导致datetime转换失败:MySql.Data.Types.MySqlDateTime”的对象无法转换为类型“System.Nullable`1[System.DateTime]
allow zero datetime=true导致datetime转换失败:MySql.Data.Types.MySqlDateTime”的对象无法转换为类型“System.Nullable`1[S ...
- "SQL Server does not handle comparison of NText, Text, Xml, or Image data types."
"SQL Server does not handle comparison of NText, Text, Xml, or Image data types." sql2000 ...
随机推荐
- php对csv文件的读取,写入,输出下载操作
在实际工作中,很多时候需要把网站上的一些数据下载到CSV文件里,方便以后查看. 亦或者是用CSV进行一些批量的上传工作. 这个时候我们就需要对CSV进行读写操作. 1.CSV的读取操作 <?ph ...
- JQ中 trigger()和triggerHandler()区别
既然使用了trigger和triggerHandler,那么你应该了解了他们的差别了. trigger():在每一个匹配的元素上触发某类事件. triggerHandler():这个特别的方法将会触发 ...
- 在Unicode版Inno Setup中使用ISSkin
ISSkin是Code jock 公司出品的Inno Setup 皮肤插件,用于为Inno制作的安装程序提供皮肤功能. 自Delphi发布2009之后,Inno Setup 开始出现支持Unicode ...
- pip 豆瓣镜像使用
pip install -i https://pypi.douban.com/simple/ flask 要用https的 https://pip.pypa.io/en/latest/user_gui ...
- CDN技术分享
CDN技术分享目录 网络应用服务发展 CDN技术 1.CDN是什么?为什么我们需要它?(简介) 2.CDN能做什么?(作用) 3.CDN是如何工作?(原理) 4.CDN有那些具体应用?(应用) 我们项 ...
- Scala 深入浅出实战经典 第41讲:List继承体系实现内幕和方法操作源码揭秘
Scala 深入浅出实战经典 第41讲:List继承体系实现内幕和方法操作源码揭秘 package com.parllay.scala.dataset /** * Created by richard ...
- 杀死O2O的三大杀手?!
0个O2O领域,20多个“已故”项目,三种不同的死因……记者糜丰.孙锋将O2O项目的一些固有问题分析得淋漓尽致! 这三个O2O杀手分别是:买不起的流量.承担不起的物流成本.惹不起的传统企业. 除了找钱 ...
- MYSQL INSERT INTO SELECT 不插入重复数据
INSERT INTO `b_common_member_count` (uid) SELECT uid FROM `b_common_member` WHERE uid NOT IN (SELECT ...
- ./adb: cannot execute binary file:
问题描述: 在32位ubuntu(12.04)上下载了最新的android SDK,使用SDK manager 下载ADB之后发现,无法运行ADB命令,排除权限问题,在网上搜到答案: http://a ...
- 64位Linux下编译搭建Nginx1.5与PHP5.5(CentOS6.4)
(1)安装Nginx1.5.2更新Nginx和PHP的依赖包yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng \libp ...