小编pen*_*ope的帖子

将一行cv :: Mat转换为std :: vector

我有一个相当简单的问题:如何获取一行cv::Mat并获取所有数据std::vector?该cv::Mat包含doubles(它可以为这个问题的目的,任何简单数据类型).

浏览OpenCV文档非常令人困惑,除非我将页面标记为Googling两次找不到文档页面,其中大部分内容并不容易导航.

我发现cv::Mat::at(..)要访问Matrix元素,但我记得C OpenCV至少有3种不同的方式来访问元素,所有这些方法都用于不同的目的...不记得用于哪些:/

因此,虽然逐个元素复制Matrix肯定会起作用,但我正在寻找一种更有效的方法,如果可能的话,比每行的for循环更优雅一些.

c++ opencv copy vector

9
推荐指数
3
解决办法
3万
查看次数

使用不完整类型无效 - 为什么在这种情况下没有错误?

我很困惑为什么我的代码没有产生错误invalid use of incomplete type,而我所做的关于这个错误的所有读数表明它应该.
这个问题源于我的代码中具有类似结构的部分出现的错误(如预期),但我无法在一个例子中重现它(请参阅问题末尾的免责声明).

我想要做的总结:

  • 我有一个结构(Tree),我想为它分配不同的基类型对象First.
  • 具体实现First具有不同的返回值,因此使用了两个间接级别:
  • First是一个抽象基类,First *用于处理不同的具体实例.
  • template <typename Type> class TypedFirst : public First是一个抽象类型,它定义具有返回类型的函数Type.
  • 最后ConcreteFirstX是具体的专业化TypedFirst<Type>.

tree.tpp,为什么调用new TF(this) 不会产生invalid use of incomplete type错误?(在代码中标记了斑点)我认为错误应该在那里,因为,虽然TF是模板,当我使用时ConcreteFirstA,tree.tpp它不知道它(它不包括concretefirsta.h甚至first.h,它只是前向声明First)

可以在pastebin上找到此示例的完整,可编译和可运行的代码.在这里,#define为了简洁,我将排除警卫和类似的事情.代码如下:

// tree.h
class First;
class Tree{ …
Run Code Online (Sandbox Code Playgroud)

c++ templates incomplete-type

9
推荐指数
1
解决办法
912
查看次数

具有连续(非独特)约束的背包

我观看了动态编程 - Kapsack问题(YouTube).但是,我正在解决一个稍微不同的问题,其中约束是预算,价格,是双倍,而不是整数.所以我想知道如何修改它?双是"连续"不像整数,我可以有1,2,3 ....我不认为我做0.0,0.1,0.2 ......?

更新1

我想通过乘以100将double转换为int.Money只有2位小数.但这意味着价值范围会非常大?

更新2

我需要解决的问题是:

物品具有价格(双倍)和满意度(整数)值.我有预算作为约束,我需要最大化满意度.

在youtube视频中,作者创建了两个2d数组,如int [numItems] [possibleCapacity(weight)].在这里,我不能预算是一个双重不整数

algorithm knapsack-problem dynamic-programming

8
推荐指数
2
解决办法
7367
查看次数

逻辑和bool变量的奇怪断言失败

我的代码中的一些断言刚开始表现得很奇怪,我想知道是否有人之前有过类似的情况.一个简短的代码片段,如:

#include <cassert>

class A{
    protected:
        bool isM, isN;

    public:
        void someFunction();
};

A::someFunction(){
    assert (this->isM && this->isN);

    ... 
}
Run Code Online (Sandbox Code Playgroud)

产生一个assertion failed结果.另一方面,稍微更改代码后:

A::someFunction(){
    assert(this->isM);
    assert(this->isN);

    ...
}
Run Code Online (Sandbox Code Playgroud)

断言通过没有问题,函数正常完成.函数正常完成是预期的功能,因为bool变量是在实际调用之前设置的someFunction().

另外一个问题是,有没有更好的方法在C++中进行断言?我在C上长大,我仍在使用C风格的断言.我刚刚在谷歌的表面划了一下,但没有发现什么暗示有什么新东西.

哦,如果需要,我可以为类和变量提供更多的上下文,如果这还不足以让任何人认识到有问题的情况.该bool变量在子类的实例了实际设定的,而someFunction在实施了罕见的功能之一class A接口,但由于这个问题复杂化,我只会更详细,如果社会认为它相关的编辑.

c++ debugging assert

7
推荐指数
1
解决办法
882
查看次数

std :: multiset <int>与std :: map <int,std :: size_t>保持多个可重复的整数值

我想创建一个记录来保存有关的信息

  • a)存在什么样的元素和
  • b)存在的各种元素的数量

在树的节点中.我会明确地仅存储叶节点信息,而父节点中的信息可以通过结合这一切的信息获取的孩子(如儿童1具有的3个对象,B的1个对象,儿童2有1 A对象,C对象的2个对象有4个A对象,1个B对象和2个C对象.

从父节点请求此信息时,我会小心不要首先请求,使用和丢弃子节点的信息,然后是其父节点,但向上构造将是一个常见的操作.其他两个常见的操作直接来自我存储的内容:是X类的对象存在吗?以及有多少种X物品存在?还有多少种物品?

对象种类表示为整数,对象编号始终为整数值.什么是更好的选择(以及所选选项的参数):

  • 使用std::multiset<int>,操作std::multiset::count()std::multiset::find()操作(更容易结合但元素重复,难以获得完全不同的元素数)
  • 使用std::map<int, std::size_t>种类作为键和对象数量作为值(没有重复的元素,std::map::find()存在的函数,大小给出了存储的正确数量的对象种类,但访问不存在的元素会无意中增加大小)

谢谢你的建议!

c++ containers stl

7
推荐指数
1
解决办法
1295
查看次数

使用OpenCV保存整数CV_32S图像

我正在使用包含有符号整数数据的TIF图像.成功输入并处理后,我需要以相同的格式输出图像(输入和输出*.tif文件).

对于输入,我知道OpenCV不知道数据是有符号还是无符号,所以它假设是无符号的.使用这个技巧解决了这个问题(切换cv::Mat手工类型).

但是,当我输出图像并再次加载时,我没有得到预期的结果.该文件包含多个段(像素组),格式如下(我必须使用此格式):

  • 不属于任何段的所有像素都具有该值 -9999
  • 属于单个段的所有像素具有相同的正整数值
  • (例如,第一段的所有像素都有值1,第二段2等)

以下是示例代码:

void ImageProcessor::saveSegments(const std::string &filename){
    cv::Mat segmentation = cv::Mat(workingImage.size().height,
                                   workingImage.size().width,
                                   CV_32S, cv::Scalar(-9999));

    for (int i=0, szi = segmentsInput.size(); i < szi; ++i){
        for (int j=0, szj = segmentsInput[i].size(); j < szj; ++j){
            segmentation.at<int>(segmentsInput[i][j].Y,
                                 ssegmentsInput[i][j].X) = i+1;
        }
    }
    cv::imwrite(filename, segmentation);
}
Run Code Online (Sandbox Code Playgroud)

你可以假定所有的变量(例如workingImage,segmentsInput)存在全局变量.

使用此代码,当我输入图像并检查值时,大多数值都设置为,0而设置的值采用整个范围的整数值(在我的示例中,我有20个段).

c++ opencv image

7
推荐指数
1
解决办法
1127
查看次数

C++声明了一个函数,而不是调用一个复杂的构造函数

首先,我知道stackoverflow上已经有类似的问题(这个,这个这个),这就是为什么我理解我的问题的原因.不幸的是,这并没有帮助我解决它.

虽然上面的问题都与默认的无参数构造函数有关,但在使用带有默认值双参数构造函数时我遇到了问题- 我试图构造一个对象,只调用给定的第一个值来构造构造函数,并将其解析为函数声明而不是对象.

以下是我的代码的一些片段(我重命名了类名,因为它们很长且不相关):

class algoContainer{
public:
algoContainer(algo1Virtual &alg1 = algo1Concrete::emptyInstance(),
      algo2Virtual &alg2 = algo2Concrete::instance());

someUsefulFunction();
};

class algo1Concrete : public algo1Virtual{
    private:
    algo1Concrete();
    public:
    static algo1Concrete &emptyInstance(); // "empty" instance treated
                                           // specifically
                                           //  -- uses private no arg constructor
    algo1Concrete(const std::vector<data> &myData); // construcotr
};

class algo1Virtual{
    // ... all functions virtual, no implementations ...
};


// ... similar for algo2Virtual/Concrete ...
Run Code Online (Sandbox Code Playgroud)

Concrete类中的所有函数都是实现的,而类中的所有函数都不Virtual是(构造函数和析构函数除外).

所以,我现在的问题是我想做的事情如下 …

c++ constructor most-vexing-parse function-declaration

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

将表示2D数组的std :: vector <std :: vector <double >>转换为cv :: Mat

将嵌套std::vectorstd::vectors 转换为最优雅有效的方法是cv::Mat什么?嵌套结构保持一个数组,即所有内部std::vectors具有相同的大小并表示矩阵行.我不介意将数据从一个复制到另一个.

我知道单个非嵌套std::vector很容易,有一个构造函数:

std::vector <double> myvec;
cv::Mat mymat;

// fill myvec
bool copy = true;

myMat = cv::Mat(myvec, copy);
Run Code Online (Sandbox Code Playgroud)

嵌套向量怎么样?

c++ opencv vector image-processing stdvector

6
推荐指数
2
解决办法
7222
查看次数

使用提示将已排序的范围插入到std :: set中

假设我有一个std::set(根据定义排序),并且我有另一系列的排序元素(为了简单起见,在另一个std::set对象中).此外,我保证第二组中的所有值都大于第一组中的所有值.

我知道我可以有效地插入一个元素std::set- 如果我传递一个正确的hint,这将是O(1).我知道我可以插入任何范围std::set,但是当没有hint通过时,这将是O(k logN)(其中k是新元素的数量,N个旧元素的数量).

我可以在a中插入一个范围std::set并提供一个hint我能想到的唯一方法是使用a进行单个插入hint,这确实将我的情况下插入操作的复杂性降低到O(k):

std::set <int> bigSet{1,2,5,7,10,15,18};
std::set <int> biggerSet{50,60,70};  

for(auto bigElem : biggerSet)
    bigSet.insert(bigSet.end(), bigElem);
Run Code Online (Sandbox Code Playgroud)

c++ stdset c++11

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

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
查看次数