小编pen*_*ope的帖子

C++ OpenCV视觉库是否适合这种图像分割的情况?

我正在尝试为C++找到一个易于使用的视觉库.这是我的情况:我有一个与计算机连接的摄像头(为简单起见,我们可以假设计算机上存在图像文件),这就是图像理想情况下的样子:

在此输入图像描述

这个想法是垂直堆叠的三个物体将具有高度对比的颜色.我需要确定物体的位置,所以视觉库将不得不找到物体的边缘或确定它们的质量中心.

我之前从未使用过视觉系统,所以我一直在做一些研究,看起来OpenCV很受欢迎.它可以很容易地用于我的应用程序,还是有另一个库可以用来轻松确定对象的位置?

谢谢你的建议!

c++ computer-vision image-segmentation

5
推荐指数
2
解决办法
1332
查看次数

在哪里初始化随机种子以供多个随机模块使用?

因此,每次我开发一些大的东西,将多个模块组合在一起构建最终功能时,我一直在想同样的问题:如果超过 1 个模块需要使用随机函数,那么在哪里初始化随机种子?

如果我有一个需要随机的类(例如,通过使用自行实现的快速排序对输入数组进行排序来初始化自身的类,因此我需要一个随机数作为主元选择),我通常有一个私有变量,static bool isRandOn;所以在开始之前随机枢轴选择,我检查该变量,srand(time(NULL));如果随机尚未启用,则执行此操作。

如果命名空间中有大量实用函数,我会做非常类似的事情:我将这样的变量放在 utils 库内的匿名命名空间中,并执行与类大致相同的操作。

我遇到的问题是组合这些模块时。就其本身而言,我知道每个模块不会多次设置种子。但是,我希望能够一起使用不同数量的模块,我希望其他人能够独立于其他模块使用我的一个或多个模块......

那么,处理多个需要随机种子的模块的最佳方法是什么?在每个模块中设置种子?根本不设置种子,而是记录随机数的使用,并让用户在想要使用该模块时初始化种子?第三种东西?

c++ random srand

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

不使用外部库的稀疏矢量实现建议

我必须在当前项目中使用稀疏向量来处理某些事情.但是,由于我不负责该项目,我不能使用我想要的任何外部库.我只有STL和OpenCV可用.

我已经查看了几个stackoverflow回答的问题,但他们要么专注于一个特定的方法,比较有限数量的方法(2)和外部库,当他们专门处理稀疏向量.实现稀疏矩阵也有一些很好的想法.

我想要的是一个稀疏的向量(索引总是在一维,数据与这个问题无关).我想要的东西不是自己实现的项目,但可以用于超出示范目的(例如,我希望获得合适的速度而不是太多的内存开销)并且希望重新以后用过.我考虑的选项包括:

  • 根据我的需要调整SparseMatOpenCV实现
  • 使用a std::map来存储值(或者可以创建一个非常简单的包装器,在索引零元素的情况下返回默认值)
  • 使用std::vector< std::pair < int , data_type > >我可以将索引和数据存储在std::pair元素中的位置

对于作为稀疏向量的通用目的,这些解决方案中的任何一个是更好/更差吗?我知道每件事的每一种方法都有它起伏不定,但是我们非常赞赏有关选择哪种方法的建议.此外,如果有人认为他有更好的建议,推荐一种我没有考虑过的方法会更受欢迎.


我具体情况的用法如下:

  • 该矢量很可能在创建后不会被修改(现在我没有看到任何需要,但我无法保证100%它不会出现)
  • 预计最常见的操作是两个这样的向量的点积(因此,或多或少以线性顺序方式访问元素)
  • 我现在可以预见的唯一查询是(可能)检查天气某个元素是否为零元素
  • 预计会有大约500个非零元素
  • 简而言之,大多数时候稀疏矢量将被用作矢量(多维点)的数学概念,而不需要分别检查每个坐标

尽管如此,正如我在原始问题中所写的那样,我想了解通用稀疏矢量实现的建议.

c++ sparse-matrix data-structures

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

Code :: Blocks报告另一个正在运行的实例,即使没有实例也是如此

当我尝试运行Code :: Blocks时,收到以下错误消息:

另一个程序实例已在运行.Code :: Blocks当前配置为仅允许一个正在运行的实例.

您可以在菜单项"环境"下访问此设置.

当我没有正确关闭谷歌Chrome时,我之前遇到过类似的问题,但对于Chrome,我设法找到锁定文件,删除它,它解决了问题.

对于Code :: Blocks,我环顾四周并尝试了几种提议的解决方案,但它们都没有工作:

  • 查找进程(ps -A | grep 'codeblocks')并终止进程

    我用这种方式找到了一个流浪的过程,但杀死它并没有帮助.

  • 允许多个实例在"环境"菜单下设置

    我无法在第一时间运行任何实例,因此无法访问菜单.

    我尝试从终端运行Code :: Blocks,codeblocks --multiple-instances但该参数必须在前一段时间被放弃,因为它不再被识别.

  • 我查看了某种锁文件,尝试删除它

    不幸的是,我没有发现任何看起来像我的锁文件明显:(

codeblocks

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

Caffe内存不足,在哪里使用?

我正在尝试在经过稍微修改的SegNet-basic模型Caffe中训练网络。

我知道Check failed: error == cudaSuccess (2 vs. 0) out of memory我得到的错误是由于我的GPU内存用完了。但是,令我困惑的是:

我的“旧”训练尝试效果很好。网络初始化并运行,内容如下:

  • 批次大小4
  • Memory required for data: 1800929300(这是按批次大小计算的,因此这里是4x样本大小)
  • 参数总数:1418176
  • 网络由4x(卷积,ReLU,合并)和4x(上采样,解卷积)组成; 7x7每层内核大小的64个过滤器。

令我感到惊讶的是,我的“新”网络内存不足,并且由于减小了批处理大小,所以我不知道正在保留额外的内存是什么:

  • 批次大小1
  • Memory required for data: 1175184180 (=样本数量)
  • 参数总数:1618944
  • 输入大小沿每个维度增加了一倍(预期的输出大小不会改变),因此,参数数量增加的原因是网络开始时的另一组参数(卷积,ReLU,池化)。

通过累加每层尺寸数获得的分层参数,该脚本可以计算出参数数量。

假设每个参数需要4个字节的内存,与新的相比,data_memory+num_param*4旧设置仍然需要更高的内存要求。memory_old = 1806602004 = 1.68GBmemory_new = 1181659956 = 1.10GB

我已经接受了可能需要在某处增加内存的问题,并且如果我找不到具有更多内存的GPU,则必须重新考虑我的新设置并降低输入的采样率,但是我实际上是在尝试了解哪里需要额外的内存,以及为什么我的新设置内存不足。


编辑:每个请求,这是每个网络的层尺寸以及通过它的数据的大小:

“旧”网络:

                            Top shape: 4 4 384 512 (3145728)
('conv1', (64, 4, 7, 7))           --> 4 64 384 512 (50331648)
('conv1_bn', …
Run Code Online (Sandbox Code Playgroud)

neural-network deep-learning caffe conv-neural-network

5
推荐指数
0
解决办法
278
查看次数

使用(模拟)模板头文件时的“多重定义”

我知道 C++ 模板函数的定义必须放在头文件中。然而,出于提高我正在制作的(可能)大型库的可读性和结构的原因,我将声明与实现分开,放入“模拟”标头(其中#include实现文件,非常类似于这种文件结构)。请注意,我是否知道模板化函数的实现必须在编译时包含在内,并且我正在这样做。

\n\n

简而言之,当我将非模板化函数声明添加到实现文件中时,出现“多重定义”错误。下面是带有示例的长解释。

\n\n

当“模拟”头文件+实现文件对仅包含模板化函数的声明/实现对时,一切正常。当我仅在实现文件中添加新模板化函数的实现时,它也可以正常工作。

\n\n

工作示例(当我想使用此功能时我会这样做)#include "algo.h"main.cpp

\n\n

“模拟”头文件 algo.h

\n\n
#ifndef ALGO_H\n#define ALGO_H\n\nnamespace fl{\n    template <typename Compare>\n    void algo(.. non-templated args .., Compare order = std::less<int>());\n}\n\n#include "tpp/algo.cpp"\n\n#endif // ALGO_H\n
Run Code Online (Sandbox Code Playgroud)\n\n

实现文件 tpp/algo.cpp : (目前只是algo.tpp )
\n注意:使用该tpp/.cpp文件是在初始版本中,现在我使用每个@\xcf\x80\xce\xac\xce\xbd\xcf 的.tpp文件\x84\xce\xb1 \xe1\xbf\xa5\xce\xb5\xe1\xbf\x96 \的建议,解释在最后。

\n\n
#ifndef TPP_ALGO\n#define TPP_ALGO\n\n#include "../algo.h"\n\nnamespace fl{\n\n    template <typename Compare>\n …
Run Code Online (Sandbox Code Playgroud)

c++ templates codeblocks header-files

3
推荐指数
1
解决办法
2916
查看次数

使用SIFT描述符的OpenCV(C++)增加了检测到的功能的数量?

在使用OpenCV 的SIFT描述符实现时,我有点混乱.

我正在尝试测试各种特征检测器+描述符计算方法,所以我使用了cv::FeatureDetectorcv::DescriptorExtractor接口的组合,这使我可以简单地在不同的检测器方法和描述符之间进行更改.

在调用cv::DescriptorExtractor::compute(...)(单个图像的变体)时,文档说如果无法计算描述符,那么给予算法的关键点数量可能会减少,我理解这样做的原因和原因.

但是,我发生的事情是描述符计算后关键点的数量实际上增加了.显然是这样,我并不是想阻止它发生,我只是希望解释为什么(只是一个直观的描述会很酷,尽管我更欣赏它).

我在实际的OpenCV周围有多层包装层没有任何代码(只是设置一些本地非OpenCV标志),所以这里是在其底部调用的OpenCV代码:

cv::Ptr<cv::FeatureDetector> dect = cv::FeatureDetector::create("MSER");
cv::Mat input = cv::imread("someImg.ppm", 0);
std::vector<cv::KeyPoint> keypoints;
dect->detect(input, keypoints);

cv::Ptr<cv::DescriptorExtractor>deEx=cv::DescriptorCalculator::create("SIFT");

std::cout << "before computing, feats size " << keypoints.size() << std::endl;
// code to print out 10 features

cv::Mat desc;
deEx->compute(input, keypoints, desc);

std::cout << "after computing, feats size " << keypoints.size() << std::endl;
// code to print out 10 features
Run Code Online (Sandbox Code Playgroud)

我在描述符计算之前和之后打印出前10个关键点,所以这里有一些具体数字作为例子:

before computing, feats size 379
feat[0]: …
Run Code Online (Sandbox Code Playgroud)

c++ opencv sift feature-detection

0
推荐指数
1
解决办法
6083
查看次数

在std :: vector.reserve()之后重新分配std :: vector

我有一段代码,我首先将一些值放入a中std::vector,然后将其中每个值的地址提供给将要使用它们的对象之一,如下所示:

std::vector < useSomeObject > uso;

// uso is filled

std::vector < someObject > obj;

for (int i=0; i < numberOfDesiredObjects; ++i){
    obj.push_back(someObject());
    obj.back().fillWithData();
}
for (int i=0; i < numberOfDesiredObjects; ++i){
    uso[i].setSomeObject(&obj[i]);
}

// use objects via uso vector
// deallocate everything
Run Code Online (Sandbox Code Playgroud)

现在,因为我有时候是一个风格怪物,我认为这很难看,并且只想使用1 for loop,有点像这样:

for (int i=0; i < numberOfDesiredObjects; ++i){
    obj.push_back(someObject());
    obj.back().fillWithData();
    uso[i].setSomeObject(&obj.back());
}
Run Code Online (Sandbox Code Playgroud)

当然,我不能这样做,因为偶尔会发生重新分配,并且我设置的所有指针都变得无效.

所以,我的问题是:std::vector.reserve()如果您知道自己需要多少并且想要提前分配内存, 我知道这是要走的路.如果我确保我要提前分配足够的内存reserve(),这是否可以保证我的指针保持有效?

谢谢.


边注. 是一个类似的问题,但对我想知道的内容没有答案.只是为了防止它弹出作为对这个问题的第一个评论.

c++ memory-management

0
推荐指数
1
解决办法
581
查看次数