分类: Delphi
2011-06-06 22:58:49
1.找到并打开../opencv/cxcore/include/cxtypes.h.通读并找到可进行如下操作的函数。
a.选取一个负的浮点数,取它的绝对值,四舍五入后,取它的极值。
首先看到cvRound
CV_INLINE int cvRound( double value )
{
#if CV_SSE2
__m128d t = _mm_load_sd( &value );
return _mm_cvtsd_si32(t);
#elif defined WIN32 && !defined WIN64 && defined _MSC_VER
int t;
__asm
{
fld value;
fistp t;
}
return t;
#elif (defined HAVE_LRINT) || (defined WIN64 && !defined EM64T && defined
CV_ICC)
return (int)lrint(value);
#else
/*
the algorithm was taken from Agner Fog's optimization guide
at
*/
Cv64suf temp;
temp.f = value + 6755399441055744.0;
return (int)temp.u;
#endif
}
Round 这个单词有四舍五入的含义,单从函数名字的字面上理解,就只有四舍五入的作用。
其代码用#if分开,分为使用特定指令集指令计算和普通计算,
=======
I will do more explicit here in another time.
两种如何计算的细节
=======
而后的cvFloor和cvCeil分别是取参数四舍五入后的两种极值。
b.产生一些随机数。
随机数生成的区域
/*************** Random number generation *******************/
typedef uint64 CvRNG;
CV_INLINE CvRNG cvRNG( int64 seed CV_DEFAULT(-1))
{
CvRNG rng = seed ? (uint64)seed : (uint64)(int64)-1;
return rng;
}
/* returns random 32-bit unsigned integer */
CV_INLINE unsigned cvRandInt( CvRNG* rng )
{
uint64 temp = *rng;
temp = (uint64)(unsigned)temp*1554115554 + (temp >> 32);
*rng = temp;
return (unsigned)temp;
}
/* returns random floating-point number between 0 and 1 */
CV_INLINE double cvRandReal( CvRNG* rng )
{
return cvRandInt(rng)*2.3283064365386962890625e-10 /* 2^-32 */;
}
c.创建一个浮点型CvPoint2D32f,并转换成一个整数型CvPoint。
是这个
CV_INLINE CvPoint cvPointFrom32f( CvPoint2D32f point )
{
CvPoint ipt;
ipt.x = cvRound(point.x);
ipt.y = cvRound(point.y);
return ipt;
}
d.将一个CvPoint转换成一个CvPoint2D32f。
很明显,当然是这个了。
CV_INLINE CvPoint2D32f cvPointTo32f( CvPoint point )
{
return cvPoint2D32f( (float)point.x, (float)point.y );
}
2.下面这个练习是帮助掌握矩阵类型。创造一个三通道二维矩阵,字节类型,大小为
100x100,并设置所有数值为0。
a.在矩阵中使用void cvCircle(CvArr* img, CvPoint center, intradius,CvScalar
color,int thickness=1, int line_type=8, int shift=0)画一个圆。
b.使用第2章所学的方法来显示这幅图像。
#include "stdafx.h"
#include
#include
#include
int _tmain(int argc, _TCHAR* argv[])
{
void* myCvMat;
myCvMat = cvCreateMat(100,100,CV_8UC3);
cvCircle(myCvMat,cvPoint(50,50),20,cvScalar(177,177,177),1,8,0);
cvNamedWindow("Example2.2",CV_WINDOW_AUTOSIZE);
cvShowImage("Example2.2",myCvMat);
cvWaitKey(0);
return 0;
}
----------------------------------------------------------------------
在VS2010下,作为console程序编译的代码,结果有图像显示,但是显示的背景有竖道道。估计是初值没有如题目要求都设成0的原因。这里把Mat中的点都设成0,用循环赋值就可以。但我目前还不知道有没有内建的类似这种功能的函数。教材中没有提。有待进一步细探。
-----------------------------------------------------------------------
3. 创建一个拥有三个通道的二维字节类型矩阵,大小为100x100,并将所有值赋为0。通过
函数cvPtr2D 将指针指向中间的通道(“绿色”)。以(20,5)与(40,20)为顶点间画
一个绿色的长方形。
4.创建一个大小为100x100的三通道RGB图像。将它的元素全部置0.使用指针算法以(20,5
)与(40,20)为顶点绘制一个绿色平面。