【温故知新C/C++】cv::Mat||cvCreateImage||cvcopy ||GetTickCount函数||cvFloor||CV_EXPORTS!

cv::Mat

在网上看到了cv::Mat和IplImage之间的转换,放在这里以备后用

1.IplImage -> cv::Mat
這個範例程式裡 image.cpp有啊,做個簡單的範例。
Ex.
IplImage* pImg = cvLoadImage(“lena.jpg”);
cv::Mat img(pImg,0); //0是不複製影像,也就是pImg與img的data共用同個記憶體位置,header各自有

2.cv::Mat -> IplImage
cxcore.hpp裡,class cv::Mat裡面第831、832有寫
// converts header to IplImage; no data is copied operator IplImage() const;
範例接上面的過來..
Ex.
IplImage* pImg = cvLoadImage(“lena.jpg”);
cv::Mat img(pImg,0); //img拿到pImg的data
IplImage qImg;
qImg = IplImage(img); //一樣檔案沒複製,所以qImg.imageData就是指向pImg->imageData

 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

cvCreateImage是openCV中的一个函数。OpenCV是Intel公司支持的开源计算机视觉库。

  cvCreateImage:

  创建头并分配数据

  IplImage* cvCreateImage( CvSize size, int depth, int channels );

  参数说明:

  size 图像宽、高.

  depth 图像元素的位深度,可以是下面的其中之一:

  IPL_DEPTH_8U - 无符号8位整型

  IPL_DEPTH_8S - 有符号8位整型

  IPL_DEPTH_16U - 无符号16位整型

  IPL_DEPTH_16S - 有符号16位整型

  IPL_DEPTH_32S - 有符号32位整型

  IPL_DEPTH_32F - 单精度浮点数

  IPL_DEPTH_64F - 双精度浮点数

  channels:

  每个元素(像素)通道号.可以是 1, 2, 3 或 4.通道是交叉存取的,例如通常的彩色图像数据排列是:b0 g0 r0 b1 g1 r1 ... 虽然通常 IPL 图象格式可以存贮非交叉存取的图像,并且一些OpenCV 也能处理他, 但是这个函数只能创建交叉存取图像.

  函数 cvCreateImage 创建头并分配数据,这个函数是下列的缩写型式:

  header = cvCreateImageHeader(size,depth,channels);

  cvCreateData(header);

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

cvcopy : 拷贝一个数组给另一个数组

  void cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask=NULL );

  src

  输入数组。

  dst

  输出数组。

  mask

  操作掩码是8比特单通道的数组,它指定了输出数组中被改变的元素。

  函数cvCopy从输入数组中复制选定的成分到输出数组:

  如果mask(I)!=0,则dst(I)=src(I)。

  如果输入输出数组中的一个是IplImage类型的话,其ROI和COI将被使用。输入输出数组必须是同样的类型、维数和大小。函数也可以用来复制散列数组(这种情况下不支持mask)。

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

GetTickCount函数  函数功能:GetTickCount返回(retrieve)从操作系统启动到现在所经过(elapsed)的毫秒数,它的返回值是DWORD。

GetTickcount函数:它返回从操作系统启动到当前所经过的毫秒数,常常用来判断某个方法执行的时间,其函数原型是DWORD GetTickCount(void),返回值以32位的双字类型DWORD存储,因此可以存储的最大值是2-1 ms约为49.71天,因此若系统运行时间超过49.71天时,这个数就会归0,MSDN中也明确的提到了:"Retrieves the number of milliseconds that have elapsed since the system was started, up to 49.7 days."。因此,如果是编写服务器端程序,此处一定要万分注意,避免引起意外的状况。

 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

函数 cvRound, cvFloor, cvCeil 用一种舍入方法将输入浮点数转换成整数。 cvRound 返回和参数最接近的整数值。 cvFloor 返回不大于参数的最大整数值。cvCeil 返回不小于参数的最小整数值。在某些体系结构中该函数 工作起来比标准 C 操作起来还要快。

++++++++++++++++++++++++++++++++++++++++++++

 

首先说一下

class CV_EXPORTS Mat ;

1.

CV_EXPORTS 的定义如下

#if (defined WIN32 || defined _WIN32 || defined WIN64 || defined _WIN64 || defined WINCE) && defined CVAPI_EXPORTS
    #define CV_EXPORTS __declspec(dllexport)
#else
    #define CV_EXPORTS
#endif

_______

define CV_EXTERN_C extern "C"

#define CV_EXPORTS

#define CV_CDECL __cdecl

因此,解嵌套宏之后,CVAPI(void)就是用extern "C" CV_EXPORTS void __cdecl替换就行,其中,CV_EXPORTS因为定义的时候为空,所以在这里只是占位,没有用到,可以不考虑。

这我自己的一点理解,如有不对之处,请指正。谢谢

 

http://hi.baidu.com/bolobolopig/blog/item/67f729df47d0571062279878.html 
2. IMPORT_C and EXPORT_C
2007年12月06日 星期四 14:33

IMPORT_C 是一个宏,在 e32def.h 定,意思是从 DLL 中入函数。

#define IMPORT_C __declspec(dllexport)


如果一个 DLL 函数要被入到用程序那么这个函数必首先以 IMPORT_C 声明,告诉编译器,个函数可以在 DLL 中找到。

EXPORT_C 也是一个在 e32def.h 定的宏,意思是从 DLL 中出函数。

#define EXPORT_C __declspec(dllexport)


如果一个函数是 DLL API 的一部分, 并且要在用程序或其他 DLL 中被用,那么这个函数在C++源文件中必须实现为导出。
需要注意的是在 WINS 下, IMPORT_CEXPORT_C 被定 义为 __declspec(export)

你可能感兴趣的:(PKU,Research)