当前位置:首页 > 代码 > 正文

跟随粒子代码(粒子跟随路径)[20240422更新]

admin 发布:2024-04-22 06:01 113


今天给各位分享跟随粒子代码的知识,其中也会对粒子跟随路径进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

我的世界1.13.2跟随玩家的粒子效果指令

/execute at @a run particle 粒子效果的名称 粒子发生的坐标(x y z) 粒子扩散的坐标(x y z) 粒子速度(大于等于0,太大不好,会卡) 粒子数量(大于等于0,同理,太大卡)

我的世界粒子指令怎么移动

粒子代码:粒子的命名空间ID,具体效果参考《JAVE版粒子特效代码》《基岩版粒子代码》。

显示位置:指定创造粒子的坐标位置,可以使用相对坐标(~ ~1 ~)或绝对坐标(98 66 55)。

扩散范围:指定粒子生成的区域,根据粒子的三维坐标增减。

粒子速度:指定粒子的速度,默认为0。

粒子数量:生成粒子效果的数量,默认为0。

显示模式:增加可视距离,有两个参数数:force(强制512格)和normal(正常32格)。

谁有粒子滤波C++实现的代码

程序流程:

1.命令行参数处理 -

2.设置随机数生成器环境,创建随机数生成器、并且对其初始化。-

3.初始化视频句柄 -

4.取视频中的一帧进行处理 -

1)GRB-HSV

2)保存当前帧在frames

3) 判断是否为第一帧,

若是则,

(1)忙等用户选定欲跟踪的区域

(2)计算相关区域直方图

(3)得到跟踪粒子

若不是则,

(1)对每个粒子作变换,并计算每个粒子的权重

(2)对粒子集合进行归一化

(3)重新采样粒子

4)画出粒子所代表的区域

5.释放图像

OpenCV学习——物体跟踪的粒子滤波算法实现之命令行参数处理

void arg_parse( int argc, char** argv )

{

int i = 0;

pname = remove_path( argv[0] );

while( TRUE )

{

char* arg_check;

int arg = getopt( argc, argv, OPTIONS );

if( arg == -1 )

break;

switch( arg )

{

case 'h':

usage( pname );

exit(0);

break;

case 'a':

show_all = TRUE;

break;

case 'o':

export = TRUE;

break;

case 'p':

if( ! optarg )

fatal_error( "error parsing arguments at -%c\n" \

"Try '%s -h' for help.", arg, pname );

num_particles = strtol( optarg, arg_check, 10 );

if( arg_check == optarg || *arg_check != '\0' )

fatal_error( "-%c option requires an integer argument\n" \

"Try '%s -h' for help.", arg, pname );

break;

default:

fatal_error( "-%c: invalid option\nTry '%s -h' for help.",

optopt, pname );

}

}

if( argc - optind 1 )

fatal_error( "no input image specified.\nTry '%s -h' for help.", pname );

if( argc - optind 2 )

fatal_error( "too many arguments.\nTry '%s -h' for help.", pname );

vid_file = argv[optind];

}

作者使用Getopt这个系统函数对命令行进行解析,-h表示显示帮助,-a表示将所有粒子所代表的位置都显示出来,-o表示输出tracking的帧,-p number进行粒子数的设定,然后再最后指定要处理的视频文件。

OpenCV学习——物体跟踪的粒子滤波算法实现之RGB-HSV

IplImage* bgr2hsv( IplImage* bgr )

{

IplImage* bgr32f, * hsv;

bgr32f = cvCreateImage( cvGetSize(bgr), IPL_DEPTH_32F, 3 );

hsv = cvCreateImage( cvGetSize(bgr), IPL_DEPTH_32F, 3 );

cvConvertScale( bgr, bgr32f, 1.0 / 255.0, 0 );

cvCvtColor( bgr32f, hsv, CV_BGR2HSV );

cvReleaseImage( bgr32f );

return hsv;

}

程序现将图像的像素值归一化,然后使用OpenCV中的cvCvtcolor函数将图像从RGB空间转换到HSV空间。

OpenCV学习——物体跟踪的粒子滤波算法实现之设定随机数

gsl_rng_env_setup();//setup the enviorment of random number generator

rng = gsl_rng_alloc( gsl_rng_mt19937 );//create a random number generator

gsl_rng_set( rng, time(NULL) );//initializes the random number generator.

作者使用GSL库进行随机数的产生,GSL是GNU的科学计算库,其中手册中random部分所述进行随机数生成有三个步骤:

随机数生成器环境建立,随机数生成器的创建,随机数生成器的初始化。

OpenCV学习——物体跟踪的粒子滤波算法实现之计算选定区域直方图

histogram** compute_ref_histos( IplImage* frame, CvRect* regions, int n )

{

histogram** histos = malloc( n * sizeof( histogram* ) );

IplImage* tmp;

int i;

for( i = 0; i n; i++ )

{

cvSetImageROI( frame, regions[i] );//set the region of interest

tmp = cvCreateImage( cvGetSize( frame ), IPL_DEPTH_32F, 3 );

cvCopy( frame, tmp, NULL );

cvResetImageROI( frame );//free the ROI

histos[i] = calc_histogram( tmp, 1 );//calculate the hisrogram

normalize_histogram( histos[i] );//Normalizes a histogram so all bins sum to 1.0

cvReleaseImage( tmp );

}

return histos;

}

程序中先设置了一个类型为histogram的指向指针的指针,是histogram指针数组的指针,这个数组是多个选定区域的直方图数据存放的位置。然后对于每一个用户指定的区域,在第一帧中都进行了ROI区域设置,通过对ROI区域的设置取出选定区域,交给函数calc_histogram计算出直方图,并使用normalize_histogram对直方图进行归一化。

计算直方图的函数详解如下:

histogram* calc_histogram( IplImage** imgs, int n )

{

IplImage* img;

histogram* histo;

IplImage* h, * s, * v;

float* hist;

int i, r, c, bin;

histo = malloc( sizeof(histogram) );

histo-n = NH*NS + NV;

hist = histo-histo;

memset( hist, 0, histo-n * sizeof(float) );

for( i = 0; i n; i++ )

{

img = imgs[i];

h = cvCreateImage( cvGetSize(img), IPL_DEPTH_32F, 1 );

s = cvCreateImage( cvGetSize(img), IPL_DEPTH_32F, 1 );

v = cvCreateImage( cvGetSize(img), IPL_DEPTH_32F, 1 );

cvCvtPixToPlane( img, h, s, v, NULL );

for( r = 0; r img-height; r++ )

for( c = 0; c img-width; c++ )

{

bin = histo_bin( pixval32f( h, r, c ),

pixval32f( s, r, c ),

pixval32f( v, r, c ) );

hist[bin] += 1;

}

cvReleaseImage( h );

cvReleaseImage( s );

cvReleaseImage( v );

}

return histo;

}

这个函数将h、s、 v分别取出,然后以从上到下,从左到右的方式遍历以函数histo_bin的评判规则放入相应的bin中(很形象的)。函数histo_bin的评判规则详见下图:

|----|----|----|。。。。|----|------|------|。。。。|-------|

1NH 2NH 3NH NS*NH NS*NH+1 NS*NH+2 NS*NH+NV

OpenCV学习——物体跟踪的粒子滤波算法实现之初始化粒子集

particle* init_distribution( CvRect* regions, histogram** histos, int n, int p)

{

particle* particles;

int np;

float x, y;

int i, j, width, height, k = 0;

particles = malloc( p * sizeof( particle ) );

np = p / n;

for( i = 0; i n; i++ )

{

width = regions[i].width;

height = regions[i].height;

x = regions[i].x + width / 2;

y = regions[i].y + height / 2;

for( j = 0; j np; j++ )

{

particles[k].x0 = particles[k].xp = particles[k].x = x;

particles[k].y0 = particles[k].yp = particles[k].y = y;

particles[k].sp = particles[k].s = 1.0;

particles[k].width = width;

particles[k].height = height;

particles[k].histo = histos[i];

particles[k++].w = 0;

}

}

i = 0;

while( k p )

{

width = regions[i].width;

height = regions[i].height;

x = regions[i].x + width / 2;

y = regions[i].y + height / 2;

particles[k].x0 = particles[k].xp = particles[k].x = x;

particles[k].y0 = particles[k].yp = particles[k].y = y;

particles[k].sp = particles[k].s = 1.0;

particles[k].width = width;

particles[k].height = height;

particles[k].histo = histos[i];

particles[k++].w = 0;

i = ( i + 1 ) % n;

}

return particles;

}

程序中的变量np是指若有多个区域n,则一个区域内的粒子数为p/n,这样粒子的总数为p。然后程序对每个区域(n个)中p/n个粒子进行初始化,三个位置坐标都为选定区域的中点,比例都为1,宽度和高度为选定区域的高度。然后又跑了个循环确定p个粒子被初始化。

OpenCV学习——物体跟踪的粒子滤波算法实现之粒子集合变换

particle transition( particle p, int w, int h, gsl_rng* rng )

{

float x, y, s;

particle pn;

x = A1 * ( p.x - p.x0 ) + A2 * ( p.xp - p.x0 ) +

B0 * gsl_ran_gaussian( rng, TRANS_X_STD ) + p.x0;

pn.x = MAX( 0.0, MIN( (float)w - 1.0, x ) );

y = A1 * ( p.y - p.y0 ) + A2 * ( p.yp - p.y0 ) +

B0 * gsl_ran_gaussian( rng, TRANS_Y_STD ) + p.y0;

pn.y = MAX( 0.0, MIN( (float)h - 1.0, y ) );

s = A1 * ( p.s - 1.0 ) + A2 * ( p.sp - 1.0 ) +

B0 * gsl_ran_gaussian( rng, TRANS_S_STD ) + 1.0;

pn.s = MAX( 0.1, s );

pn.xp = p.x;

pn.yp = p.y;

pn.sp = p.s;

pn.x0 = p.x0;

pn.y0 = p.y0;

pn.width = p.width;

pn.height = p.height;

pn.histo = p.histo;

pn.w = 0;

return pn;

}

程序使用动态二阶自回归模型作为基本变换思路,变换的对象有坐标x,坐标y,和比例s。变换的x和y要符合在width和height之内的条件。

OpenCV学习——物体跟踪的粒子滤波算法实现之粒子集重新采样

particle* resample( particle* particles, int n )

{

particle* new_particles;

int i, j, np, k = 0;

qsort( particles, n, sizeof( particle ), particle_cmp );

new_particles = malloc( n * sizeof( particle ) );

for( i = 0; i n; i++ )

{

np = cvRound( particles[i].w * n );

for( j = 0; j np; j++ )

{

new_particles[k++] = particles[i];

if( k == n )

goto exit;

}

}

while( k n )

new_particles[k++] = particles[0];

exit:

return new_particles;

}

程序先使用C标准库中的qsort排序函数,按照权重,由大到小将原粒子集排序。然后将权重大的在新的粒子集中分配的多一点。

OpenCV学习——物体跟踪的粒子滤波算法实现之权重归一化

void normalize_weights( particle* particles, int n )

{

float sum = 0;

int i;

for( i = 0; i n; i++ )

sum += particles[i].w;

for( i = 0; i n; i++ )

particles[i].w /= sum;

}

我的世界1.7.2怎么用命令方块召唤跟随玩家粒子效果

先拿一个命令块 /give @p command_block

然后命令/particle 粒子名 ~ ~ ~ 1 1 1 0.2 30 @a

/particle 粒子名 x y z (向X轴扩散大小) (向Y轴扩散大小) (向Z轴扩散大小) 0.2 30 @a

接上中继器的高频就行了。

最后献上一堆粒子名:

lava岩浆

note音符

flame刷怪笼的刷怪时的火焰

dripWater/Lava水、岩浆

portal传送门

snowshovel雪

cloud云

spell药水

满意请采纳,不懂可追问

跟随粒子代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于粒子跟随路径、跟随粒子代码的信息别忘了在本站进行查找喔。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/240.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载