目标跟踪——测试平台小结

跟踪算法评测平台使用总结

注:适用于Python算法。

1.OTB平台

准备:

开始:

解压pysot-tookit后的文件结构:

在这里插入图片描述

  • 环境准备

    git clone https://github.com/StrangerZhang/pysot-toolkit
    pip install -r requirements.txt
    cd pysot\\utils\\
    python setup.py build_ext --inplace  # 这一步很重要
    # if you need to draw graph, you need latex installed on your system
    
  • 数据集文件结构

    Download json files used in our toolkit baidu pan or Google Drive

    1. Put CVRP13.json, OTB100.json, OTB50.json in OTB100 dataset directory (you need to copy Jogging to Jogging-1 and Jogging-2, and copy Skating2 to Skating2-1 and Skating2-2 or using softlink)

      The directory should have the below format

      | – OTB100/

      ​ | – Basketball

      ​ | …

      ​ | – Woman

      ​ | – OTB100.json

      | --OTB50/

      ​ | – Basketball

      ​ | …

      ​ | – Woman

      ​ | – OTB50.json

      | – VOT2016/

      ​ | – bag

      ​ | …

      ​ | – wiper

      ​ | – VOT2016.json

    2. Put all other jsons in the dataset directory like in step 1

  • 1.1. Evaluation on OTB100(UAV123, NFS, LaSOT)

在这里插入图片描述

converted *.txt tracking results will be released soon

OTB100和OTB50*.txt跟踪结果:

链接:https://pan.baidu.com/s/13jeOhKTxswsJ6kSJzoavVg
提取码:wwmg

cd path\\pysot-toolkit python bin\\eval.py
--dataset_dir path\\OTB100\\		# dataset path
	--dataset OTB100 				# dataset name(OTB100, UAV123, NFS, LaSOT)
	--tracker_result_dir path\\results	# tracker dir
	--trackers SiamRPN++ C-COT DaSiamRPN ECO  # tracker names  在路径下要有相关tracker的txt跟踪结果
	--num 4 				  	# evaluation thread
	--show_video_level  # wether to show video results
	--vis 			    # draw graph
	# --vis是画图用的,如果latex相关的包没装的话,可以先不用这个命令

# you will see (Normalized Precision not used in OTB evaluation)
-----------------------------------------------------
|Tracker name| Success | Norm Precision | Precision |
-----------------------------------------------------
| SiamRPN++  |  0.696  |     0.000      |   0.914   |
|    ECO     |  0.691  |     0.000      |   0.910   |
|   C-COT    |  0.671  |     0.000      |   0.898   |
| DaSiamRPN  |  0.658  |     0.000      |   0.880   |
-----------------------------------------------------

-----------------------------------------------------------------------------------------
|    Tracker name     |      SiamRPN++      |      DaSiamRPN      |         ECO         |
-----------------------------------------------------------------------------------------
|     Video name      | success | precision | success | precision | success | precision |
-----------------------------------------------------------------------------------------
|     Basketball      |  0.423  |   0.555   |  0.677  |   0.865   |  0.653  |   0.800   |
|        Biker        |  0.728  |   0.932   |  0.319  |   0.448   |  0.506  |   0.832   |
|        Bird1        |  0.207  |   0.360   |  0.274  |   0.508   |  0.192  |   0.302   |
|        Bird2        |  0.629  |   0.742   |  0.604  |   0.697   |  0.775  |   0.882   |
|      BlurBody       |  0.823  |   0.879   |  0.759  |   0.767   |  0.713  |   0.894   |
|      BlurCar1       |  0.803  |   0.917   |  0.837  |   0.895   |  0.851  |   0.934   |
|      BlurCar2       |  0.864  |   0.926   |  0.794  |   0.872   |  0.883  |   0.931   |
......
|        Vase         |  0.564  |   0.698   |  0.554  |   0.742   |  0.544  |   0.752   |
|       Walking       |  0.761  |   0.956   |  0.745  |   0.932   |  0.709  |   0.955   |
|      Walking2       |  0.362  |   0.476   |  0.263  |   0.371   |  0.793  |   0.941   |
|        Woman        |  0.615  |   0.908   |  0.648  |   0.887   |  0.771  |   0.936   |
-----------------------------------------------------------------------------------------
OTB100 Success PlotOTB100 Precision Plot
在这里插入图片描述在这里插入图片描述

更新日期:2020-11-07

  • 1.2. 如何利用pysot对比各OTB算法时输出高清图?

需要安装matlab

step1: 获取pysot平台中跑出的结果

a:在pysot-toolkit中找到draw_success_precision.py文件

# 文件包含关系如下
pysot-toolkit -> pysot -> visualization -> draw_success_precision.py

b:找到结果输出位置

def draw_success_precision(success_ret, name, videos, attr, precision_ret=None,
                           norm_precision_ret=None, bold_name=None, axis=[0, 1]):
    # success plot
    fig, ax = plt.subplots()
    ax.grid(b=True)
    ax.set_aspect(1)
    plt.xlabel('Overlap threshold')
    plt.ylabel('Success rate')
    if attr == 'ALL':
        plt.title(r'\textbf{Success plots of OPE on %s}' % (name))
    else:
        plt.title(r'\textbf{Success plots of OPE - %s}' % (attr))
    plt.axis([0, 1] + axis)
    success = {}
    thresholds = np.arange(0, 1.05, 0.05)
    for tracker_name in success_ret.keys():
        value = [v for k, v in success_ret[tracker_name].items() if k in videos]
        success[tracker_name] = np.mean(value)
    for idx, (tracker_name, auc) in enumerate(sorted(success.items(), key=lambda x: x[1], reverse=True)):
        if tracker_name == bold_name:
            label = r"\textbf{[%.3f] %s}" % (auc, tracker_name)
        else:
            label = "[%.3f] " % (auc) + tracker_name
        value = [v for k, v in success_ret[tracker_name].items() if k in videos]
        # ------在这里保存 accuracy 评测结果------
        # 注意:以下将测试结果保存为json文件,json文件中的 键key 名称可以按照自己的需求更改。以下是我的命名方式。  如果要用我的格式,在自己的accuracy_result.json中要预先输入 "[]"字符,防止读取时出错。
        filename = "accuracy_result.json"
        item_list = []
        with open(filename, 'r') as f:
            load_dict = json.load(f)
            num_item = len(load_dict)
            for i in range(num_item):
                video_attr_name_ = load_dict[i]['video_attr']
                tracker_name_ = load_dict[i]['tracker_name']
                auc_ = load_dict[i]['accuracy']
                thresholds_ = load_dict[i]['thresholds']
                mean_value_ = load_dict[i]['mean_value']
                item_dict = {'video_attr': video_attr_name_, 'tracker_name': tracker_name_, 'accuracy': auc_, 'thresholds': thresholds_,
                             'mean_value': mean_value_}
                item_list.append(item_dict)

        trackers_info = {'video_attr': attr, 'tracker_name': tracker_name, 'accuracy': auc, 'thresholds': thresholds.tolist(),
                         'mean_value': np.mean(value, axis=0).tolist()}
        data = dict(trackers_info)
        item_list.append(data)

        with open(filename, 'w', encoding='utf=8') as file_obj:
            json.dump(item_list, file_obj, ensure_ascii=False)
        # -----------------------------
        plt.plot(thresholds, np.mean(value, axis=0), color=COLOR[idx], linestyle=LINE_STYLE[idx], label=label,
                 linewidth=2)
    ax.legend(loc='lower left', labelspacing=0.2)
    ax.autoscale(enable=True, axis='both', tight=True)
    xmin, xmax, ymin, ymax = plt.axis()
    ax.autoscale(enable=False)
    ymax += 0.03
    ymin = 0
    plt.axis([xmin, xmax, ymin, ymax])
    plt.xticks(np.arange(xmin, xmax + 0.01, 0.1))
    plt.yticks(np.arange(ymin, ymax, 0.1))
    ax.set_aspect((xmax - xmin) / (ymax - ymin))
    plt.show()
    if precision_ret:
        # norm precision plot
        fig, ax = plt.subplots()
        ax.grid(b=True)
        ax.set_aspect(50)
        plt.xlabel('Location error threshold')
        plt.ylabel('Precision')
        if attr == 'ALL':
            plt.title(r'\textbf{Precision plots of OPE on %s}' % (name))
        else:
            plt.title(r'\textbf{Precision plots of OPE - %s}' % (attr))
        plt.axis([0, 50] + axis)
        precision = {}
        thresholds = np.arange(0, 51, 1)
        for tracker_name in precision_ret.keys():
            value = [v for k, v in precision_ret[tracker_name].items() if k in videos]
            precision[tracker_name] = np.mean(value, axis=0)[20]
        for idx, (tracker_name, pre) in \
                enumerate(sorted(precision.items(), key=lambda x: x[1], reverse=True)):
            if tracker_name == bold_name:
                label = r"\textbf{[%.3f] %s}" % (pre, tracker_name)
            else:
                label = "[%.3f] " % (pre) + tracker_name
            value = [v for k, v in precision_ret[tracker_name].items() if k in videos]
            # ------在这里保存 precision 评测结果------
        # 注意:以下将测试结果保存为json文件,json文件中的 键key 名称可以按照自己的需求更改。以下是我的命名方式。  如果要用我的格式,在自己的precision_result.json中要预先输入 "[]"字符,防止读取时出错。
        filename = "precision_result.json"
            item_list = []
            with open(filename, 'r') as f:
                load_dict = json.load(f)
                num_item = len(load_dict)
                for i in range(num_item):
                    video_attr_name_ = load_dict[i]['video_attr']
                    tracker_name_ = load_dict[i]['tracker_name']
                    pre_ = load_dict[i]['precision']
                    location_error_ = load_dict[i]['location_error']
                    mean_value_ = load_dict[i]['mean_value']
                    item_dict = {'video_attr': video_attr_name_, 'tracker_name': tracker_name_, 'precision': pre_,
                                 'location_error': location_error_,
                                 'mean_value': mean_value_}
                    item_list.append(item_dict)

            trackers_info = {'video_attr': attr, 'tracker_name': tracker_name, 'precision': pre,
                             'location_error': thresholds.tolist(),
                             'mean_value': np.mean(value, axis=0).tolist()}
            data = dict(trackers_info)
            item_list.append(data)

            with open(filename, 'w', encoding='utf=8') as file_obj:
                json.dump(item_list, file_obj, ensure_ascii=False)
        # -----------------------------
            plt.plot(thresholds, np.mean(value, axis=0),
                     color=COLOR[idx], linestyle=LINE_STYLE[idx], label=label, linewidth=2)
        ax.legend(loc='lower right', labelspacing=0.2)
        ax.autoscale(enable=True, axis='both', tight=True)
        xmin, xmax, ymin, ymax = plt.axis()
        ax.autoscale(enable=False)
        ymax += 0.03
        ymin = 0
        plt.axis([xmin, xmax, ymin, ymax])
        plt.xticks(np.arange(xmin, xmax + 0.01, 5))
        plt.yticks(np.arange(ymin, ymax, 0.1))
        ax.set_aspect((xmax - xmin) / (ymax - ymin))
        plt.show()

保存后的json文件如下所示。

以otb100的accuracy为例

[
    {
        "video_attr": "ALL",
        "tracker_name": "DaSiamRPN",
        "accuracy": 0.6578104106074384,
        "thresholds": [
            0.0,
            0.05,
            0.1,
            0.15000000000000002,
            0.2,
            0.25,
            0.30000000000000004,
            0.35000000000000003,
            0.4,
            0.45,
            0.5,
            0.55,
            0.6000000000000001,
            0.65,
            0.7000000000000001,
            0.75,
            0.8,
            0.8500000000000001,
            0.9,
            0.9500000000000001,
            1.0
        ],
        "mean_value": [
            0.9442233914404641,
            0.9386702705241673,
            0.9358224717968006,
            0.9329490228341751,
            0.9294467194126408,
            0.9242290436430551,
            0.918775949005531,
            0.9120206475895232,
            0.9030748049982816,
            0.8892517872628702,
            0.8651162378188131,
            0.8221880079818227,
            0.7589487728879333,
            0.672489943960896,
            0.5608077548971072,
            0.42703502833315193,
            0.2779701329365757,
            0.1420961105674596,
            0.05026509393708969,
            0.008637430927851134,
            0.0
        ]
    },
            ...
]

百度云链接:
https://pan.baidu.com/s/1tg5MV7wbHTntMFEuJNR7uA
链接:https://pan.baidu.com/s/1tg5MV7wbHTntMFEuJNR7uA
提取码:fa35

# 算法          发表日期      OTB100        OTB50
CFNet           2017          √             √
DaSiamRPN       2018          √             √
DeepSRDCF       2015          √             √
GradNet         2019          √             √
SiamDWfc        2019          √             √
SiamDWrpn       2019          ×             ×
SiamFC          2016          √             √
SiamRPN         2018          √             √
Staple          2016          √             √
SRDCF           2015          √             √
fDSST           2017          √             √

step2:matlab中画图 ^ _ ^,matlab总是能画出高清矢量图

thresholds作为x轴坐标 mean_value作为y轴坐标,accuracy作为图例中的参数,matlab代码如下所示
注意:我用的是笨方法(一个一个导入,可费劲了 -_-),逐条输入数据。你们可以让matlab自动读入数据,自动画图。


x = [0.0, 0.05, 0.1,0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1];

% DaSiamRPN
y1 = [0.9442233914404641,0.9386702705241673,0.9358224717968006,0.9329490228341751,0.9294467194126408,0.9242290436430551,0.918775949005531,0.9120206475895232,0.9030748049982816,0.8892517872628702,0.8651162378188131,0.8221880079818227,0.7589487728879333,0.672489943960896,0.5608077548971072,0.42703502833315193,0.2779701329365757,0.1420961105674596,0.05026509393708969,0.008637430927851134,0.0];

% GradNet
y2 = [0.9263890592030127,0.9218735240699784,0.9180412466836074,0.9127812779935524,0.9041223754825147,0.8966298031432164,0.8853508338000691,0.87057875287613,0.8513960351013828,0.8289370631565266,0.7991511226444641,0.7555322219703103,0.7060119546890604,0.6390773684333284,0.5568406090656736,0.4486608397681775,0.3164612695936204,0.18370840425201745,0.07358659837845453,0.017753140520270425,0.0];

% DeepSRDCF
y3 = [0.9295271862209883,0.923564608930089,0.9156696191746453,0.9064032039074287,0.8917670371030297,0.8790174777978871,0.863456570635697,0.8448654214894227,0.8254515139185511,0.802168940787343,0.7727848765724907,0.7333073463110571,0.6851679976700313,0.6275305128569844,0.554241793966035,0.4670845219748036,0.36238573466845286,0.2340082307211255,0.10137347730290586,0.022128601347098976,0.0];

% SiamRPN
y4 = [0.9326766663901934,0.9255093274885584,0.9192133043519823,0.9136078036834928,0.9074477960737707,0.8989501070538686,0.8912679201132064,0.882685993915506,0.8686661593995951,0.8444571822190547,0.8133285089505476,0.7706641617556328,0.71102371407216,0.6227243722020586,0.5122682209199629,0.3828773582703887,0.24408493798654715,0.12331002199308587,0.03778983976289278,0.004494551749426426,0.0];

% SiamDWfc
y5 = [0.9073859407131067,0.9010755773457866,0.8959148900672925,0.8903851976534368,0.8838893031816778,0.8772825676028024,0.8680768769635214,0.8558826013609128,0.8382919876499139,0.8156116434308225,0.7864772972635317,0.7480002308650145,0.6934843482246645,0.620176933653182,0.5395945497875223,0.4402527933461412,0.31911536339025137,0.19337848020348197,0.07978362337400152,0.016731017267435408,0.0];

% SRDCF
y6 = [0.8668064582004582,0.8607457284994612,0.8558321351852903,0.8476239199593887,0.8377001002853492,0.8275946792019205,0.8166957682883003,0.8005720423400038,0.7794128247362038,0.7537710822057495,0.7286118600843976,0.6981424274681797,0.6592349773321172,0.606291581417098,0.5340779001665525,0.4437965132347132,0.3353806626049053,0.20333498782970838,0.08281285987756977,0.01918824189997814,0.0];

% CFNet
y7 = [0.8545821143325211,0.8505685608306334,0.8472334743196367,0.8424287875916306,0.8360067630585298,0.828284405476835,0.8143046383609033,0.8011905308206508,0.7816948675237534,0.7574987291741957,0.7280635057572741,0.6936511578938139,0.6444722079337629,0.5757790611801646,0.4947852743544796,0.3984019876580399,0.2908731675612074,0.18312170057556673,0.08390257095991266,0.021383078431070488,0.0];

% SiamFC
y8 = [0.8545171995952235,0.8469311400179531,0.8418608927151742,0.8360257556280485,0.8308315196594619,0.8233318811647429,0.8114615239678525,0.798049266221633,0.7799392516263487,0.7574352478717283,0.7306011065744853,0.689176637957252,0.6418671593563158,0.5848415673533651,0.5124502884105385,0.4166055475262083,0.3008903455058429,0.17838459825278036,0.06776497508907947,0.013871717907547624,0.0];

% Staple
y9 = [0.851514531428886,0.8429061886397691,0.8358422111901332,0.8280623836473364,0.8182027104586048,0.8081127769778973,0.7915709685374521,0.7717263149451264,0.7517459480384794,0.7262557772735901,0.699110956929411,0.6645317809619083,0.6287365415888684,0.5804212891127789,0.5154574757678585,0.42398714524561626,0.3113226826739766,0.1857374881736212,0.07585342411376178,0.019092064943305845,0.0];

% fDSST
y10 = [0.7840765750133489,0.7726510881012206,0.758088268642461,0.7469882478399419,0.7335544633487623,0.7165357934898212,0.6970075626360174,0.6759587348448904,0.6530882882330847,0.6299143718517752,0.6058091574814283,0.5805499117014249,0.5491592397632852,0.5115603084178555,0.46052010438209545,0.38926357137032286,0.2968780547682986,0.18956815141711864,0.08922156350324331,0.02449715223862947,0.0];
y = {y1,y2, y3, y4, y5, y6, y7, y8, y9, y10};


tracker_names = { 'DaSiamRPN', 'GradNet', 'DeepSRDCF', 'SiamRPN', 'SiamDWfc', 'SRDCF', 'CFNet', 'SiamFC', 'Staple' 'fDSST'};
aucs = [0.658 0.639, 0.635, 0.629, 0.627, 0.598, 0.587, 0.587, 0.578, 0.517];
lines_style = {'-', '--', ':', '-', '--', ':', '-', '--', ':', '-', '--', ':', '-', '--', ':'};
lines_color = {[1, 0, 0 ], [0, 1, 0], [1, 0, 1],[1, 1, 0],[0, 162/255, 232/255],[0.5, 0.5, 0.5], [0, 0, 1],[0, 1, 1],[136/255, 0, 21/255], [255/255, 127/255, 39/255], [0,0,0],[0, 150/255, 150/255], [150/255, 0, 150/255], [150/255, 150/255, 0], [150/255, 120/255, 110/255]};
% line_pro = {'r-', 'g--', 'b:', 'c:.', 'm-', 'y--', 'k:', 'g:', 'b--', 'c--', 'y-'};
legend_str = {}; %画图例用   cell类型
for i=1:length(tracker_names)
    % 读取 线型 和 颜色
    style_line = lines_style(i);
    style_line = style_line{1};
    color_line = lines_color(i);
    color_line = color_line{1};
    
    plot(x,y{1,i},'Color', color_line, 'LineStyle', style_line, 'LineWidth', 2);
    legend_str(end+1) = strcat(' [', num2str(aucs(i)),']', tracker_names(i));
    hold on;
end
% 图例要一次性输出,不要在循环里逐个输出,不然最后一个会覆盖前面的图例
legend(legend_str, 'Location','SouthWest');

grid on;
set(gca,'xtick', 0:0.1:1);
set(gca,'ytick', 0:0.1:1);
set(gca, 'FontName', '微软雅黑', 'FontSize',8.5);
xlabel('重叠率阈值','FontName','微软雅黑');
ylabel('成功率','FontName','微软雅黑');

在这里插入图片描述

step3: 将matlab图保存为emf格式,然后复制到word中就可以得到高清图了(用电脑看图软件打开是模糊的,但是复制到word后是高清图)。类似地可以输出precision图,需要更改matlab中的x坐标和y坐标,还有图例中的变量值和tracker名字。
在这里插入图片描述

在这里插入图片描述

PS: VOT评测图暂时我没画,用表格数据对比吧。

On the way


2. VOT平台

注:目前Pysot我没有完全看懂,EAO(Expected Average Overlap)值输出有问题,只能输出A(Accuracy)和R(Robustness)。
EAO值只能用官方给的输出:QAQ

官方工具包链接: https://github.com/votchallenge/vot-toolkit (配置的时候有可能有问题)

我是在Ubuntu下的Matlab用的VOT包,我的CSDN博客: https://blog.csdn.net/qq_29894613/article/details/101172584

准备:和OTB准备一样

开始:

cd path\\pysot-toolkit python bin\\eval.py 
	--dataset_dir path\\VOT2016\\		# dataset path
	--dataset VOT2016 				# dataset name(VOT2018, VOT2016)
	--tracker_result_dir path\\results\\ 	# tracker dir
	--trackers ECO UPDT SiamRPNpp 			# tracker names 在路径下要有相关tracker的txt跟踪结果

# you will see
------------------------------------------------------------
|Tracker Name| Accuracy | Robustness | Lost Number |  EAO  |
------------------------------------------------------------
| SiamRPNpp  |  0.600   |   0.234    |    50.0     | 0.415 |
|    UPDT    |  0.536   |   0.184    |    39.2     | 0.378 |
|    ECO     |  0.484   |   0.276    |    59.0     | 0.280 |
------------------------------------------------------------

注意:我运行这段代码时会出现问题,我改了以下的代码:

# 代码所在的位置为pysot-toolkit\\pysot\\datasets\\vot.py 
# class VOTVideo -> def load_tracker() -> 75行 

# 源代码
for name in tracker_names:
	traj_files = glob(os.path.join(path, name, 'baseline', self.name, '*0*.txt'))

# 更改后的代码
for name in tracker_names:
	traj_files = glob(path + '/' + name + '/' + 'baseline' + '/' + self.name + '/*.txt')

3.生成自己tracker的*.txt文件

注:OTB平台和VOT的*.txt文件都可以在Pysot工具中生成。

代码格式

from pysot.datasets import DatasetFactory
from pysot.utils.region import vot_overlap

dataset = DatasetFactory.create_dataset(name=dataset_name,
                                       	dataset_root=datset_root,
                                        load_img=False)
frame_counter = 0
pred_bboxes = []
for video in dataset:
    for idx, (img, gt_bbox) in enumerate(video):
        if idx == frame_counter:
            # init your tracker here
            pred_bbox.append(1)
        elif idx > frame_counter:
            # get tracking result here
            pred_bbox = 
            overlap = vot_overlap(pred_bbox, gt_bbox, (img.shape[1], img.shape[0]))
            if overlap > 0: 
	    	# continue tracking
                pred_bboxes.append(pred_bbox)
            else: 
	    	# lost target, restart
                pred_bboxes.append(2)
                frame_counter = idx + 5
        else:
            pred_bboxes.append(0)

自己的tracker按照上面的代码格式写,然后就可以在相关目录下生成*.txt文件

下面是我的代码:

import glob
from os.path import join, realpath, dirname
import numpy as np

import cv2
import os

from defaults import _C as cfg
import time
import torch

from tadt_tracker import Tadt_Tracker
from backbone_v2 import build_vgg16

from pysot.datasets import DatasetFactory

# VOT和OTB的ground truth表示不一样。OTB为左上角坐标和w,h  VOT为四个点的坐标
# 此函数为转化函数,嘻嘻,在网上找的,忘了出自哪里了。
def get_axis_aligned_bbox(region):
    """ convert region to (x, y, w, h) that represent by axis aligned box
        left_top :x, y
        height:h
        width:w
    """
    if isinstance(region, list):
        region = np.array(region)
    nv = region.size
    if nv == 8:
        cx = np.mean(region[0::2])
        cy = np.mean(region[1::2])
        x1 = min(region[0::2])
        x2 = max(region[0::2])
        y1 = min(region[1::2])
        y2 = max(region[1::2])
        A1 = np.linalg.norm(region[0:2] - region[2:4]) * \
            np.linalg.norm(region[2:4] - region[4:6])
        A2 = (x2 - x1) * (y2 - y1)
        s = np.sqrt(A1 / A2)
        w = s * (x2 - x1) + 1
        h = s * (y2 - y1) + 1
        x = cx - w/2
        y = cy - h/2
    else:
        x = region[0]
        y = region[1]
        w = region[2]
        h = region[3]

    return x, y, w, h


# dataset_name = "OTB50"
dataset_name = "OTB100"
# dataset_name = "VOT2016"

dataset_root = "E:\\0_OTB_benchmark\\Pysot\\dataset\\OTB100"
# dataset_root = "E:\\0_OTB_benchmark\\Pysot\\dataset\\VOT2016"

datasets_name_path = os.path.join(dataset_root, dataset_name+'.json')


device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

model = My_model()
tracker = My_Tracker(cfg, model=model, device=device, display=False)  # My_tracker为代表符,换成自己实际的名字


dataset = DatasetFactory.create_dataset(name=dataset_name,
                                        dataset_root=dataset_root,
                                        load_img=False)
frame_counter = 0
# pred_bboxes = []

video_num = 0

for video in dataset:
    video_num = video_num + 1
    # print("----eval_video_name----", video.name)
    if video_num >= 0:
        pred_bboxes = []
        for idx, (img, gt_bbox) in enumerate(video):
            print("----eval_video_name----", video.name, idx)
            initial_gt_bbox = get_axis_aligned_bbox(gt_bbox)
            if idx == frame_counter:
                # init tracker here
                print("----initialize model----")
                tracker.initialize_tadt(img, initial_gt_bbox)
                if 'VOT' in dataset_name:
                    # gt_bbox = [int(gt_bbox[0]), int(gt_bbox[1]), int(gt_bbox[2]), int(gt_bbox[3])]
                    initial_gt_bbox = [int(value) for value in initial_gt_bbox]
                    print(initial_gt_bbox)
                    pred_bboxes.append(initial_gt_bbox)
                else:
                    pred_bboxes.append(initial_gt_bbox)
                print("----initialize successfully----")
            elif idx > frame_counter:
                # get tracking result here
                pred_bbox = tracker.tracking(img, visualize=False)
                pred_bboxes.append(pred_bbox)
            print("----this video track successfully")

    # print("----eval_video_name----", video.name)
        print("----start save tracking result----")
        with open("E:\\0_OTB_benchmark\\Pysot\\pysot-toolkit\\result\\" + video.name + ".txt", "a", encoding='utf-8') as w:
            for i in range(len(pred_bboxes)):
                # print(pred_bbox)
                w.write(str(pred_bboxes[i]).strip('[').strip(']').strip('(').strip(')').replace(" ", "") + '\n')
        w.close()
        print("----save", video.name, "successfully")

5.转化别人的saw OTB跟踪结果

有些人是在VOT标准评测工具包上做的跟踪评测,生成的是.mat文件,但是在Pysot中不能用。然后我就写了一个简短的代码把.mat文件转化成.txt文件

import scipy.io as scio
import pandas as pd
import numpy as np
import os
import h5py
import hdf5storage
import shutil

# ------------------------------
# .mat文件转换成.txt文件
# ------------------------------
# 注意:下面的代码根据不同类型的.mat有所不同  可输出.mat中的keys查看
path_matfile = "E:\\0_OTB_benchmark\\OTB结果\\OTB50\\C-COT_raw_results\\C-COT_OTB_2015_results"
outpath = "E:\\0_OTB_benchmark\\OTB结果\\OTB50\\C-COT_raw_results\\txt_OTB"
all_matfile_list = os.listdir(path_matfile)

each_matfile_path = [os.path.join(path_matfile, matfile) for matfile in all_matfile_list]
videos_name_txt = [video_name.replace('OPE_', '').replace('.mat', '') + '.txt' for video_name in all_matfile_list]

for i, matfile_path in enumerate(each_matfile_path):
    # data = scio.loadmat(matfile_path)  # 有些类型的mat文件不能读取
    data = hdf5storage.loadmat(matfile_path)  # 兼容mat文件类型较多
    # 下面两行有些.mat不同
    track_result = data['results']
    # print(track_result[0][0][0][1])
    track_result = track_result[0][0][0][1]
    print(videos_name_txt[i])
    np.savetxt(os.path.join(outpath, videos_name_txt[i]), track_result, delimiter=',', fmt='%d')

6. 文件重命名

# -----------------------
# 文件重命名
# -----------------------
# 有些trackers在OTB100或OTB50中生成的是小写字母开头的跟踪结果,需要把首字母转化成大写字母,以匹配otb100.json或otb50.json  转化完后,检查一些txt文件名字是否和数据集中的一样,不一样的稍微修改一下,大概有10个左右不一样吧
# 代码依实际情况变化
src_path = "E:\\0_OTB_benchmark\\Test\\Basketball\\img"
dst_path = "E:\\0_OTB_benchmark\\Test\\dst"
all_filename = os.listdir(src_path)

print(all_filename)

all_filename_path_old = [os.path.join(src_path, filename) for filename in all_filename if '.txt' in filename]
all_filename_path_new = [os.path.join(dst_path, filename.capitalize()) for filename in all_filename] # .capitalize()将字符串首字母变为大写

for (old_file, new_file) in zip(all_filename_path_old, all_filename_path_new):
	os.renames(old_file, new_file)  # 把原来的文件夹覆盖掉了,先拷贝一份,以防万一

7.从OTB100中转移OTB50

# 从OTB100中转移OTB50数据
src_otb100_path = "E:\\0_OTB_benchmark\\Pysot\\pysot-toolkit\\result\\Results_OTB100"
dst_otb50_path = "E:\\0_OTB_benchmark\\Pysot\\pysot-toolkit\\result\\Results_OTB50"

template_tracker = os.path.join(dst_otb50_path, 'Initial_Method')
template_videos = os.listdir(template_tracker)

all_trackername = os.listdir(src_otb100_path)
src_trackers = [os.path.join(src_otb100_path, src_tracker) for src_tracker in all_trackername]

for tracker_file in all_trackername:
    if tracker_file not in os.listdir(dst_otb50_path):
        os.mkdir(os.path.join(dst_otb50_path, tracker_file))

print(template_videos)
print(all_trackername)

for i, tracker in enumerate(src_trackers):
    each_tracker_videos = os.listdir(tracker)
    for video in template_videos:
        shutil.copyfile(os.path.join(tracker, video), os.path.join(dst_otb50_path, all_trackername[i], video))
  • 7
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 31
    评论
第1章 Windows Embedded CE 1.1 嵌入式 1.1.1 嵌入式设备 1.1.2 嵌入式软件 1.1.3 嵌入式设备和软件 1.2 Windows Embedded系列 1.3 Windows XP Embedded 1.4 Windows Embedded Point of Service 1.5 Windows Embedded CE 6.0 1.5.1 模块化和简洁的操作系统 1.5.2 实时操作系统 1.5.3 硬件支持 1.5.4 CE 6.0 R2的新特性 1.5.5 定制的UI 1.5.6 有线和无线连接 1.5.7 图形和多媒体 1.5.8 多语言的国际化定位 1.5.9 实时通信和VolP 1.5.10 OS设计模板 1.6 开发CE应用程序 1.7 测试和调试 1.8 Windows Embedded CE的功能 1.9 小结 第2章 开发环境和工具 2.1 Windows Embedded CE Platform Builder 2.2 安装Windows Embedded CE 6.0 2.2.1 支持的处理器 2.2.2 安装顺序 2.2.3 快速修复工程和更新 2.2.4 Windows Embedded CE术语表 2.2.5 Windows Embedded CE环境变量 2.2.6 Windows Embedded CE文件和目录 2.2.7 第三方组件 2.3 构建CE运行时映像 2.4 小结 第3章板级支持包 3.1 BSP概述 3.2 BSP开发 3.2.1 复制设备仿真器BSP 3.2.2 复制CEPC BSP 3.2.3 复制ICOP eBox4300 60E BSP 3.2.4 BSP组件、文件和文件夹 3.2.5 添加文件和模块到BSP中 3.3 小结 第4章 构建定制的CE 6.0运行时映像 4.1 创建初始OS设计 4.1.1 OS设计向导 4.1.2 OS设计项目文件夹和文件 4.1.3 VS2005 IDE中的OS设计项目视图 4.1.4 生成OS运行时映像 4.1.5 MyCEPCBSP的OS运行时映像 4.1.6 MveBox4300BSP的OS运行时映像 4.2 小结 第5章连接目标设备 5.1 目标设备的连接 5.2 连接仿真器 5.2.1 创建MyEmulator目标设备配置文件 5.2.2 设置MyEmulator目标设备配置 5.2.3 将运行映像下载到仿真器中 5.3 连接eBox.4300一MSJK 5.3.1 通过DHCP连接eBOX.4300.MSJK 5.3.2 通过静态IP连接eBOX.4300.MSJK 5.4 连接到CEPC 5.4.1 创建CEPC启动软盘 5.4.2 通过串口连接CEPC 5.4.3 利用以太网连接CEPC 5.5 小结 第6章调试和调试工具 6.1 调试环境 6.1.1 CETK 6.1.2 CoreCon 6.1.3 调试和发布配置 6.2 调试OS设计构建 6.2.1 CE构建过程 6.2.2 构建错误——文件丢失 6.3 远程工具 6.3.1 远程文件查看器(Remote File Viewer) 6.3.2 远程堆遍历器(Remote Heap Walker) 6.3.3 远程放大器(Remote Zoom.In) 6.3.4 远程进程查看器(Remote Process Viewe) 6.3.5 远程注册表编辑器(Remote RegistryEditor) 6.3.6 远程系统信息(Remote Systemlnformation) 6.3.7 远程性能监视器(Remote Performance Monitor) 6.3.8 远程间谍(Remote Spy) 6.3.9 远程内核跟踪器(Remote Kernel Tracker) 6.3.10 远程调用配置器(Remote Call Profiler) 6.4 远程目标控制(Remote Target Control) 6.5 串行调试(Serial Debug) 6.6 小结 第7章启动加载程序概述 7.1 什么是启动加载程序 7.1.1 BIOS加载程序-x86 BIOS加载程序 7.1.2 Eboot Loader 7.1.3 Loadcepc 7.1.4 Romboot Loader 7.1.5 Sboot Loader 7.2 x86设备的BIOS加载程序 7.2.1 x86设备的启动过程 7.2.2 BIOS Loader代码 7.2.3 构建BIOS Loader代码 7.3 小结 第8章 注册表 8.1 Windows Embedded CE注册表 8.2 基于RAM的注册表 8.3 基于配置单元的注册表 8.3.1 基于配置单元的注册表触发两个启动阶段 8.3.2 使用基于配置单元的注册表持久化注册表 8.3.3 注册表刷新 8.4 Windows Embedded CE注册表文件 8.4.1 Windows Embedded CE组件的注册表 8.4.2 串行调试 8.5 有用的注册表参考信息 8.5.1 自动刷新并保存注册表设置 8.5.2 USB可删除存储器的设备名 8.5.3 禁用Start菜单中的Suspend选项 8.5.4 Intemet Explorer启动页 8.5.5 静态IP地址 8.5.6 Windows EmbeddedCE设备名 8.6 访问注册表 8.7 小结 第9章 CETK测试 9.1 Windows EmbeddedCE测试工具包 9.2 CETK测试 9.3 小结 第10章 开发应用程序 10.1 开发范围格局 10.2 新型的嵌入式设备 10.3 小结 第11章 VisualC#2005应用程序 11.1 开发CE的C#应用程序 11.2 小结 第12章 VB2005应用程序 12.1 开发CE的VB应用程序 12.2 小结 第13章 原生代码应用程序 13.1 VisualC++2005原生代码应用程序 13.2 Plat form Builder原生代码应用程序 13.3 小结 第14章 自启动应用程序 14.1 配置注册表白启动 14.2 Windows\Startup自启动 14.3 Auto LaunchApp实用程序 14.4 小结 第15章 定制UI 15.1 CE设备的输入和输出 15.2 CE的自定义UI 15.3 具有NMD自定义UI的CE 15.4 VB2005应用程序作为自定义UI 15.5 小结 第16章 瘦客户端应用程序 16.1 瘦客户端 16.2 Windows瘦客户端OS 16.3 小结 第17章 家庭自动化应用 17.1 家庭自动化控制 17.2 硬件和外围设备 17.3 eBoxPhidgetOS设计 17.4 家庭自动化应用程序 17.5 小结 第18章 RFID安全访问控制应用 18.1 无线射频识别技术——RFID技术 18.2 PhidgetRF ID读取器 18.3 RFID读取器应用 18.4 小结 第19章 机器人应用 19.1 Stringer CE机器人 19.2 简单机器人控制应用 19.3 启动机器人应用程序 19.4 小结 第20章 部署CE6.0设备 20.1 Windows网络投影仪 20.2 Windows网络投影仪OS设计 20.3 Windows网络投影仪的使用 20.4 小结 附录A Windows Embedded CE资源 附录B 安装和软件 附录C 示例应用程序和OS设计项目
Part I 基础篇 OpenCV 开发基础. 1 第 1 章初识 OpenCV.. 3 1.1 OpenCV 初识 4 1.1.1 OpenCV 简介.. 4 1.1.2 OpenCV 组件及架构.. 5 1.1.3 OpenCV 资源.. 9 1.2 VS2012 安装OpenCV2.4.x .. 9 1.3 VS2013 安装OpenCV3.0 14 1.4 Sublime 下配置OpenCV. 16 1.5 小结 19 第2 章图像及视频基本操作. 20 2.1 图像初级操作 21 2.1.1 Mat 类 21 2.1.2 Mat 基本操作 23 2.1.3 Mat 类型转换 24 2.1.4 图像读取显示保存 24 2.1.5 图像存储. 26 2.2 图像几何变换 28 2.2.1 坐标映射. 28 2.2.2 平移 29 2.2.3 缩放 33 2.2.4 旋转 36 2.2.5 仿射变换. 40 2.3 视频操作.. 43 2.3.1 VideoCapture 类.. 43 2.3.2 视频写操作 45 2.3.3 视频质量评价.. 48 2.4 图像基础应用操作. 50 2.4.1 界面事件. 50 2.4.2 区域提取. 54 2.4.3 图像元素遍历——反色.. 58 2.4.4 单窗口显示多幅图像 63 2.4.5 图像颜色空间转换 66 2.4.6 图像批量读取——规则.. 69 2.4.7 图像批量读取——无规则. 70 2.5 小结 71 Part II 进阶篇图像处理技术.. 73 第 3 章进阶篇——图像灰度变换技术. 75 3.1 阈值化处理. 76 3.1.1 OTSU 阈值化 76 3.1.2 固定阈值化 79 3.1.3 自适应阈值化.. 81 3.1.4 双阈值化. 83 3.1.5 半阈值化. 84 3.2 直方图处理. 85 3.2.1 灰度直方图 85 3.2.2 H-S 直方图. 88 3.2.3 BGR 直方图.. 89 3.2.4 自定义直方图.. 91 3.2.5 灰度直方图均衡. 93 3.2.6 彩色直方图均衡. 94 3.2.7 直方图变换——查找 95 3.2.8 直方图变换——累计 97 3.2.9 直方图匹配 99 3.2.10 直方图对比.. 101 3.2.11 直方图的反向投影 105 3.3 距离变换 108 3.3.1 距离. 108 3.3.2 邻接性 109 3.3.3 区域..110 3.3.4 距离变换——扫描..110 3.3.5 距离变换——distanceTransform..113 3.4 Gamma 校正.115 3.5 其他常见的灰度变换技术117 3.5.1 线性变换117 3.5.2 对数变换119 3.5.3 对比度拉伸. 121 3.5.4 灰度级分层. 124 3.5.5 灰度比特平面 125 3.6 实例应用 128 3.6.1 最大熵阈值分割.. 128 3.6.2 投影峰谷查找 131 3.7 小结. 134 第4 章进阶篇——图像平滑技术.. 135 4.1 图像采样 136 4.1.1 最近邻插值. 136 4.1.2 双线性插值. 138 4.1.3 插值操作性能对比. 140 4.1.4 图像金字塔. 143 4.2 傅里叶变换.. 146 4.2.1 图像掩码操作 146 4.2.2 离散傅里叶. 149 4.2.3 图像卷积.. 151 4.3 图像噪声 153 4.3.1 椒盐噪声.. 153 4.3.2 高斯噪声.. 155 4.4 空间平滑 157 4.4.1 盒滤波 157 4.4.2 均值滤波.. 159 4.4.3 中值滤波.. 159 4.4.4 高斯滤波.. 161 4.4.5 双边滤波.. 163 4.5 实例应用 166 4.5.1 导向滤波.. 166 4.5.2 图像污点修复 169 4.5.3 旋转文本图像矫正. 172 4.6 小结. 178 第5 章进阶篇——边缘检测技术.. 179 5.1 边缘检测基础. 180 5.1.1 边缘检测概念 180 5.1.2 梯度算子.. 180 5.1.3 一阶微分算子 180 5.1.4 二阶微分算子 181 5.1.5 图像差分运算 182 5.1.6 非极大值抑制 184 5.2 基本边缘检测算子——Sobel 184 5.2.1 非极大值抑制Sobel 检测.. 185 5.2.2 图像直接卷积实现Sobel 186 5.2.3 图像卷积下非极大值抑制Sobel. 187 5.2.4 Sobel 库函数实现 190 5.3 基本边缘检测算子——Laplace 192 5.4 基本边缘检测算子——Roberts 194 5.5 基本边缘检测算子——Prewitt. 195 5.6 改进边缘检测算子——Canny .. 198 5.6.1 Canny 算子.. 198 5.6.2 Canny 原理及实现.. 198 5.6.3 Canny 库函数实现.. 203 5.7 改进边缘检测算子——Marr-Hildreth .. 204 5.8 几何检测 207 5.8.1 霍夫变换.. 207 5.8.2 线检测技术. 208 5.8.3 LSD 快速直线检测. 210 5.8.4 圆检测技术. 214 5.9 形状检测 215 5.9.1 轮廓检测.. 215 5.9.2 凸包检测.. 217 5.9.3 轮廓边界框. 221 5.9.4 轮廓矩 226 5.9.5 点多边形测试 229 5.10 角点检测. 232 5.10.1 moravec 角点 232 5.10.2 harris 角点. 235 5.10.3 Shi-Tomasi 角点. 238 5.11 实例应用. 240 5.11.1 颜色圆检测.. 240 5.11.2 车牌区域检测.. 243 5.12 小结 249 第6 章进阶篇——形态学技术. 250 6.1 腐蚀膨胀操作. 251 6.2 开闭运算操作. 253 6.3 形态学梯度.. 255 6.4 形态学Top-Hat.. 256 6.5 实例应用 257 6.5.1 形态学滤波角点提取. 257 6.5.2 车牌目标提取 260 6.6 小结. 263 Part III 高级篇图像应用技术. 265 第 7 章高级篇——图像分割技术.. 267 7.1 分水岭分割.. 268 7.1.1 分水岭的特征 268 7.1.2 实现分水岭分割.. 269 7.1.3 分水岭分割合并.. 270 7.2 FloodFill 分割. 273 7.3 均值漂移MeanShift 276 7.4 图割Grabcut 279 7.5 实例实例 282 7.5.1 奇异区域检测 282 7.5.2 肤色检测.. 285 7.6 小结. 288 第8 章高级篇——特征分析.. 289 8.1 尺度空间 290 8.1.1 尺度与旋转不变性. 290 8.1.2 特征点尺度变换.. 290 8.2 特征描述子.. 291 8.2.1 SIFT 特征. 292 8.2.2 SURF 特征.. 296 8.2.3 ORB 特征. 300 8.3 方向梯度直方图HOG 302 8.3.1 HOG 原理. 302 8.3.2 HOG 特征提取步骤 303 8.3.3 HOGDescriptor 特征描述类.. 304 8.3.4 HOG 特征描述实现 305 8.4 局部二值模式LBP.. 309 8.4.1 经典LBP.. 309 8.4.2 圆形LBP311 8.5 Haar 特征描述 314 8.5.1 Haar 原理. 314 8.5.2 Haar 特征提取 315 8.6 应用实例 317 8.6.1 最近邻特征点目标提取 317 8.6.2 最大极值稳定区域匹配MSER 320 8.6.3 字符特征提取 324 8.6.4 车牌字符SVM 训练.. 327 8.7 小结. 331 第 9 章高级篇——复杂视频处理技术.. 332 9.1 视频稳像技术. 333 9.2 图像拼接 338 9.2.1 拼接原理及过程.. 338 9.2.2 图像拼接实现 339 9.3 高动态范围图像HDR 342 9.3.1 HDR 合成技术.. 342 9.3.2 HDR 合成原理.. 342 9.3.3 OpenCV 实现. 343 9.4 背景建模 344 9.4.1 背景差分.. 345 9.4.2 混合高斯背景建模. 345 9.4.3 混合高斯背景建模实现 346 9.4.4 混合模型MOG2 成员参数设定. 348 9.4.5 KNN 模型背景建模实现. 349 9.4.6 GMG 模型背景建模实现 351 9.5 级联分类器——人脸检测.. 353 9.5.1 级联分类器. 353 9.5.2 CascadeClassifier 类 353 9.6 应用实例 355 9.6.1 运动目标提取 355 9.6.2 TLD 单目标跟踪.. 358 9.6.3 人眼检测与跟踪.. 361 9.7 小结. 365 附录A 366 1——代码清单.. 366 2——CMake 编译OpenCV3.1 源码. 372 3——OpenCV3.1 Extra 扩展库 375 参考文献.... 379
第1章 新一代的王者——android概览 1 1.1 智能手机市场现状 1 1.1.1 五大智能手机操作系统 1 1.1.2 智能手机市场的新星 2 1.2 android平台的特点及未来的趋势 3 1.2.1 全新理念带来的体验风暴 3 1.2.2 中国手机市场的主导性作用 4 1.2.3 手机3d游戏和应用增长迅速 4 1.3 如何搭建android开发环境 4 1.3.1 sdk的安装及环境配置 5 1.3.2 eclipse集成开发环境的搭建 7 1.3.3 创建并启动模拟器 9 1.4 hello android应用程序的开发 11 1.4.1 第一个android应用程序 12 1.4.2 android应用程序的项目结构 14 1.4.3 android应用程序的调试 16 1.4.4 实际设备的联机调试 18 1.5 android应用程序运行的机制 19 1.5.1 应用程序的系统架构 19 .1.5.2 应用程序框架 20 1.5.3 android运行时 20 1.5.4 系统库 21 1.5.5 底层linux内核 21 1.6 本章小结 22 第2章 游戏开发相关android基础知识 23 2.1 游戏中的音效 23 2.1.1 游戏中的即时音效 23 2.1.2 即时音效的一个案例 24 2.1.3 背景音乐播放技术 27 2.1.4 简易音乐播放器的实现 29 2.2 简单数据的存储——preferences 33 2.2.1 preferences简介 33 2.2.2 preferences实现访问时间的记录 33 2.3 手机自带数据库——sqlite 34 2.3.1 初识sqlite 35 2.3.2 sqlite数据库的基本操作 35 2.3.3 sqlite数据库的简单案例 37 2.3.4 使用contentprovider组件共享数据 40 2.3.5 使用contentresolver获取分享数据 42 2.4 文件i/o 43 2.4.1 访问sd卡中的文件 44 2.4.2 访问手机中的文件夹 46 2.4.3 读取assets文件夹下的内容 48 2.5 2d动画的开发 50 2.5.1 surfaceview用法简介 50 2.5.2 使用surfaceview实现2d动画 50 2.6 socket网络通信 56 2.6.1 socket开发基本知识 56 2.6.2 服务器端 57 2.6.3 客户端 58 2.7 蓝牙通信 59 2.7.1 蓝牙通信的基本知识 60 2.7.2 聊天案例概览 60 2.7.3 聊天案例的开发过程 62 2.8 本章小结 75 第3章 初识opengl es 2.0 77 3.1 opengl es 2.0概览 77 3.1.1 opengl es 2.0简介 77 3.1.2 初识opengl es 2.0应用程序 80 3.2 着色器与渲染管线 89 3.2.1 opengl es 1.x的渲染管线 89 3.2.2 opengl es 2.0的渲染管线 94 3.2.3 opengl es中立体物体的构建 97 3.3 主流android手机gpu大pk 98 3.3.1 手机gpu四大家族对比 99 3.3.2 主流gpu的性能参数比较 103 3.4 本章小结 104 第4章 着色语言shading language 105 4.1 着色语言概述 105 4.2 着色语言基础 106 4.2.1 数据类型概述 106 4.2.2 数据类型的基本使用 110 4.2.3 运算符 112 4.2.4 类型转换 114 4.2.5 限定符 115 4.2.6 流程控制 119 4.2.7 函数的声明与使用 121 4.2.8 片元着色器中浮点变量精度的指定 122 4.2.9 程序的基本结构 123 4.3 特殊的内建变量 123 4.3.1 顶点着色器中的内建变量 124 4.3.2 片元着色器中的内建变量 124 4.4 着色语言的内置函数 125 4.4.1 角度转换与三角函数 126 4.4.2 指数函数 127 4.4.3 常见函数 127 4.4.4 几何函数 130 4.4.5 矩阵函数 132 4.4.6 向量关系函数 133 4.4.7 纹理采样函数 134 4.4.8 微分函数 135 4.5 本章小结 135 第5章 投影及各种变换 136 5.1 摄像机的设置 136 5.2 两种投影方式 137 5.2.1 正交投影 137 5.2.2 透视投影 145 5.3 各种变换 148 5.3.1 基本变换的相关数学知识 148 5.3.2 平移变换 148 5.3.3 旋转变换 152 5.3.4 缩放变换 153 5.3.5 基本变换的实质 155 5.4 绘制方式 156 5.4.1 各种绘制方式概览 156 5.4.2 点与线段绘制方式 157 5.4.3 三角形条带与扇面绘制方式 159 5.4.4 顶点法与索引法 165 5.5 设置合理的视角 167 5.6 卷绕和背面剪裁 173 5.6.1 基本知识 173 5.6.2 一个简单的案例 174 5.7 本章小结 176 第6章 光照 177 6.1 曲面物体的构建 177 6.1.1 球体构建的基本原理 177 6.2.2 案例效果概览 178 6.2.3 开发步骤 179 6.2 基本光照效果 182 6.2.1 光照的基本模型 182 6.2.2 环境光 183 6.2.3 散射光 185 6.2.4 镜面光 190 6.2.5 三种光照通道的合成 194 6.3 定位光与定向光 196 6.4 点法向量和面法向量 199 6.5 光照的每顶点计算与每片元计算 202 6.6 本章小结 204 第7章 纹理映射 205 7.1 初识纹理映射 205 7.1.1 基本原理 205 7.1.2 纹理映射的简单案例 206 7.2 纹理拉伸 212 7.2.1 两种拉伸方式概览 212 7.2.2 不同拉伸方式的案例 214 7.3 纹理采样 217 7.3.1 纹理采样概述 217 7.3.2 最近点采样 218 7.3.3 线性纹理采样 219 7.3.4 min与mag采样 220 7.3.5 不同纹理采样方式的案例 221 7.4 mipmap纹理技术 226 7.5 多重纹理与过程纹理 227 7.5.1 案例概览 227 7.5.2 将2d纹理映射到球面上的策略 228 7.5.3 案例的场景结构 229 7.5.4 开发过程 230 7.6 本章小结 238 第8章 3d基本形状的构建 239 8.1 圆柱体 239 8.1.1 顶点原始位置的生成 239 8.1.2 案例的开发 241 8.2 圆锥体 244 8.2.1 顶点原始位置的生成 244 8.2.2 案例的开发 246 8.3 圆环体 248 8.3.1 顶点原始位置的生成 248 8.3.2 案例的开发 249 8.4 螺旋管 251 8.4.1 顶点原始位置的生成 252 8.4.2 案例的开发 252 8.5 几何球 253 8.5.1 顶点原始位置的生成 254 8.5.2 案例的开发 255 8.6 足球碳分子模型的搭建 262 8.6.1 搭建的基本原理 262 8.6.2 案例的开发 264 8.7 贝塞尔曲线及旋转面 270 8.7.1 三维旋转曲面的生成 270 8.7.2 贝塞尔曲线 270 8.7.3 bezier曲线生成工具 272 8.7.4 印度古典建筑场景的开发 274 8.8 本章小结 276 第9章 3d模型加载 277 9.1 obj模型文件概览 277 9.1.1 obj文件的格式 277 9.1.2 用3dmax设计3d模型 278 9.2 加载obj文件 279 9.2.1 加载仅有顶点坐标与面数据的obj文件 279 9.2.2 加载后自动计算面法向量 283 9.2.3 加载后自动计算平均法向量 286 9.2.4 加载纹理坐标 289 9.3 本章小结 292 第10章 混合与雾 293 10.1 混合技术 293 10.1.1 混合基本知识 293 10.1.2 源因子和目标因子 294 10.1.3 简单混合效果案例 295 10.2 地月系云层效果的实现 297 10.3 雾 300 10.3.1 雾的原理与优势 300 10.3.2 雾的简单实现 301 10.4 本章小结 304 第11章 常用3d开发技巧 305 11.1 标志板 305 11.1.1 案例效果与基本原理 305 11.1.2 开发步骤 306 11.2 灰度图地形 310 11.2.1 基本原理 311 11.2.2 普通灰度图地形 311 11.2.3 过程纹理地形 314 11.2.4 mipmap地形 317 11.3 天空盒与天空穹 318 11.3.1 天空盒 318 11.3.2 天空穹 320 11.3.3 天空盒与天空穹的使用技巧 321 11.4 镜像技术 322 11.4.1 镜像基本原理 322 11.4.2 基本效果案例 322 11.4.3 升级效果案例 325 11.5 动态文本输出 327 11.5.1 案例效果与基本原理 327 11.5.2 具体开发步骤 328 11.6 非真实感绘制 330 11.6.1 案例效果与基本原理 330 11.6.2 具体开发步骤 331 11.7 本章小结 332 第12章 几种剪裁与测试 333 12.1 剪裁测试 333 12.1.1 基本原理与核心代码 333 12.1.2 一个主次视角的简单案例 334 12.2 alpha测试 335 12.2.1 alpha测试基本原理 335 12.2.2 一个椭圆窗口的案例 335 12.3 模板测试 337 12.3.1 基本原理 337 12.3.2 一个简单的案例 340 12.4 任意剪裁平面 341 12.4.1 基本原理 341 12.4.2 茶壶被任意平面剪裁的案例 342 12.5 本章小结 344 第13章 顶点着色器的妙用 345 13.1 飘扬的旗帜 345 13.1.1 基本原理 345 13.1.2 开发步骤 346 13.2 扭动的软糖 349 13.2.1 基本原理 349 13.2.2 开发步骤 350 13.3 风吹椰林场景的开发 351 13.3.1 椰子树随风摇摆的基本原理 351 13.3.2 开发步骤 352 13.4 展翅飞翔的雄鹰 356 13.4.1 基本原理 356 13.4.2 开发步骤 357 13.5 二维扭曲 359 13.5.1 基本原理 359 13.5.2 开发步骤 360 13.6 opengl es 1.x与opengl es 2.0实现方案的对比 363 13.7 本章小结 364 第14章 片元着色器的妙用 365 14.1 程序纹理技术 365 14.1.1 砖块着色器 365 14.1.2 沙滩球着色器 367 14.2 数字图像处理 368 14.2.1 卷积的基本知识 369 14.2.2 平滑过滤 369 14.2.3 边缘检测 371 14.2.4 锐化处理 372 14.2.5 浮雕效果 373 14.2.6 图像渐变 374 14.3 分形着色器 375 14.3.1 曼德布罗集简介 375 14.3.2 曼德布罗集着色器的实现 376 14.3.3 将曼德布罗集纹理应用到实际物体上 378 14.3.4 茱莉亚集着色器的实现 379 14.4 本章小结 380 第15章 真实光学环境的模拟 381 15.1 投影贴图 381 15.1.1 案例效果与基本原理 381 15.1.2 开发步骤 382 15.2 反射环境模拟 385 15.2.1 案例效果与基本原理 385 15.2.2 开发步骤 386 15.3 折射环境模拟 388 15.3.1 案例效果与基本原理 388 15.3.2 开发步骤 390 15.4 色散效果的模拟 391 15.4.1 案例效果与基本原理 391 15.4.2 开发步骤 392 15.5 菲涅尔效果的模拟 393 15.5.1 案例效果与基本原理 393 15.5.2 开发步骤 394 15.6 凹凸映射 395 15.6.1 案例效果与基本原理 395 15.6.2 法向量纹理图的生成 396 15.6.3 案例的开发 399 15.7 平面阴影 404 15.7.1 案例效果与基本原理 405 15.7.2 开发步骤 406 15.8 阴影映射 409 15.8.1 案例效果与基本原理 409 15.8.2 距离纹理图的生成 411 15.8.3 阴影场景的绘制 417 15.9 光线跟踪 419 15.9.1 案例效果与基本原理 419 15.9.2 开发步骤 423 15.10 本章小结 436 第16章 游戏开发中的物理学 437 16.1 碰撞检测基本技术 437 16.1.1 aabb包围盒的基本原理 437 16.1.2 aabb包围盒的计算 438 16.1.3 aabb包围盒的碰撞检测 440 16.1.4 一个aabb包围盒的案例 442 16.1.5 旋转后的aabb包围盒 444 16.1.6 aabb包围盒的使用要点 448 16.1.7 obb包围盒 448 16.2 穿透效应 449 16.2.1 案例的运行效果与基本原理 449 16.2.2 具体开发步骤 450 16.3 粒子系统 450 16.3.1 案例运行效果与基本原理 451 16.3.2 cpu版案例的开发 452 16.3.3 gpu版案例开发步骤 453 16.4 弹簧质点模型 455 16.4.1 案例运行效果与基本原理 455 16.4.2 具体开发步骤 457 16.5 本章小结 462 第17章 游戏的心脏——物理引擎 463 17.1 物理引擎很重要 463 17.1.1 什么是物理引擎 463 17.1.2 常见的物理引擎 463 17.2 jbullet物理引擎 466 17.2.1 基本的物理学概念 466 17.2.2 jbullet中常用类的介绍 468 17.3 箱子相互碰撞的案例 475 17.3.1 案例运行效果及准备工作 476 17.3.2 案例的基本框架结构 476 17.3.3 常量类——constant 477 17.3.4 3d场景渲染类——mysurfaceview 478 17.3.5 水平地面——texfloor类 480 17.3.6 箱子——texcube类 481 17.4 复合碰撞形状的使用 483 17.4.1 案例运行效果 483 17.4.2 立方体圆柱复合形状——cubecylinder类 483 17.5 凹凸地形的案例 486 17.5.1 案例运行效果 486 17.5.2 地形类——landform 486 17.6 任意形状物体的碰撞 488 17.6.1 案例运行效果 488 17.6.2 加载物体类——loadedobjectvertexnormal 488 17.6.3 加载物体刚体类——loadrigidbody 490 17.7 铰链关节 491 17.7.1 铰链关节的基本知识 491 17.7.2 案例的运行效果 492 17.7.3 铰链关节旋转角速度的计算 493 17.7.4 3d界面渲染类——mysurfaceview 494 17.8 滑动关节 496 17.8.1 滑动关节的基本知识 496 17.8.2 案例效果图 497 17.8.3 3d界面渲染类——mysurfaceview 498 17.9 六自由度关节 502 17.9.1 六自由度关节的基本知识 502 17.9.2 案例的运行效果 503 17.9.3 人偶类——doll 503 17.9.4 拾取时采用的点对点关节 505 17.10 本章小结 509 第18章 传感器应用的开发 510 18.1 基本的开发流程 510 18.2 加速度传感器 512 18.2.1 加速度传感器简介 513 18.2.2 案例的开发 514 18.3 磁场传感器 514 18.3.1 磁场传感器简介 514 18.3.2 案例的开发 514 18.4 光传感器 516 18.4.1 光传感器简介 516 18.4.2 案例的开发 516 18.5 温度传感器 518 18.5.1 温度传感器简介 518 18.5.2 案例的开发 518 18.6 接近传感器 519 18.6.1 接近传感器简介 519 18.6.2 案例的开发 520 18.7 姿态传感器 521 18.7.1 姿态传感器简介 521 18.7.2 案例的开发 522 18.8 本章小结 528 第19章 游戏开发小贴士 529 19.1 3d拾取技术 529 19.1.1 案例效果与基本原理 529 19.1.2 开发步骤 531 19.2 多点触控 537 19.2.1 案例效果与基本原理 537 19.2.2 开发步骤 538 19.3 多键监听 541 19.3.1 案例效果与基本原理 541 19.3.2 开发步骤 542 19.4 本章小结 544 第20章 bn赛艇 545 20.1 游戏背景及功能概述 545 20.1.1 背景概述 545 20.1.2 功能介绍 545 20.2 游戏的策划及准备工作 547 20.2.1 游戏的策划 547 20.2.2 android平台下游戏的准备工作 548 20.3 游戏的架构 552 20.3.1 各个类简要介绍 553 20.3.2 游戏框架简介 558 20.4 主控制类myactivity 559 20.5 2d界面相关类 563 20.5.1 欢迎界面类welcomeview 563 20.5.2 2d界面父类mysfview 565 20.5.3 主菜单类menuview 565 20.5.4 2d界面绘制类viewfordraw 566 20.5.5 数据库工具类dbutil 568 20.5.6 android系统版本对话框androidversiondialog 570 20.6 选船界面相关类 570 20.6.1 着色器管理类shadermanager 571 20.6.2 围墙类colorlightrect 571 20.6.3 选船房间类housefordraw 573 20.6.4 展台类displaystation 575 20.6.5 赛艇类boat 576 20.6.6 选船界面xcsurfaceview 576 20.7 游戏界面相关类 582 20.7.1 进度条类process 583 20.7.2 3d物体父类bndrawer 584 20.7.3 3d物体控制类tdobjectforcontrol 584 20.7.4 赛艇类boat 585 20.7.5 可碰撞物体父类kzbjdrawer 586 20.7.6 可碰撞物体控制类kzbjforcontr

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值