小编whi*_*dow的帖子

在 C++ 中从多线程 CPU 程序迁移到 GPU

我创建了一个程序,需要使用不同的输入参数多次(很多次!!)调用一个函数。为了加快速度,我像这样进行多线程处理:

std::vector< MTDPDS* > mtdpds_list;
boost::thread_group thread_gp;
for (size_t feat_index = 0; feat_index < feat_parser.getNumberOfFeat(); ++feat_index)
{
    Feat* feat = feat_parser.getFeat(static_cast<unsigned int>(feat_index));

    // != 0 has been added to avoid a warning message during compilation
    bool rotatedFeat = (feat->flag & 0x00000020) != 0;
    if (!rotatedFeat)
    {
        Desc* desc = new Desc(total_sb, ob.size());

        MTDPDS* processing_data = new MTDPDS();
        processing_data->feat = feat;
        processing_data->desc = desc;
        processing_data->img_info = image_info;
        processing_data->data_op = &data_operations;
        processing_data->vecs_bb = vecs_bb;

        mtdpds_list.push_back(processing_data);

        thread_gp.add_thread(new boost::thread(compute_desc, processing_data));
    }
}

// Wait …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading cuda gpu

6
推荐指数
1
解决办法
3574
查看次数

ORB 取决于图像分辨率吗?

我正在尝试使用 OpenCV 从图像中检测和提取 ORB 特征。

但是,我得到的图像没有标准化(不同的大小、不同的分辨率等......)。

我想知道在提取 ORB 特征之前是否需要标准化我的图像,以便能够在图像之间匹配它们?

我知道特征检测是尺度不变的,但我不确定它对图像分辨率意味着什么(例如,2 个相同大小的图像,1 个对象靠近,另一个对象很远应该导致匹配,即使如果它们在图像上具有不同的比例,但是如果图像的大小不同怎么办?)。

我是否应该根据图像大小调整来自 ORB 的 patchSize(例如,如果我有一个 800px 的图像并采用 20px 的 patchSize,我应该为 400px 的图像采用 10px 的 patchSize 吗?)。

谢谢你。

更新: 我用高分辨率和低分辨率图像测试了不同的算法(ORB、SURF 和 SIFT)以查看它们的行为。在此图像中,对象大小相同,但图像分辨率不同:

在此处输入图片说明

我们可以看到 SIFT 非常稳定,尽管它的功能很少。SURF 在关键点和特征尺度方面也非常稳定。所以我的猜测是使用 SIFT 和 SURF 的低分辨率和高分辨率图像之间的特征匹配会起作用,但是 ORB 在低分辨率中有更大的特征,因此描述符与高分辨率图像中的特征不匹配。

(在高分辨率和低分辨率特征提取之间使用了相同的参数)。

所以我的猜测是,如果我们想在不同分辨率的图像之间进行匹配,最好使用 SIFT 或 SURF。

opencv surf sift orb

5
推荐指数
1
解决办法
2692
查看次数

标签 统计

c++ ×1

cuda ×1

gpu ×1

multithreading ×1

opencv ×1

orb ×1

sift ×1

surf ×1