Chinaunix首页 | 论坛 | 博客
  • 博客访问: 296234
  • 博文数量: 32
  • 博客积分: 665
  • 博客等级: 上士
  • 技术积分: 370
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-25 11:20
文章分类

全部博文(32)

文章存档

2023年(1)

2021年(1)

2020年(2)

2018年(3)

2014年(1)

2013年(2)

2012年(9)

2011年(9)

2010年(2)

2009年(2)

分类: 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)为顶点绘制一个绿色平面。

阅读(2728) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~