我有一个相当简单的问题:如何获取一行cv::Mat并获取所有数据std::vector?该cv::Mat包含doubles(它可以为这个问题的目的,任何简单数据类型).
浏览OpenCV文档非常令人困惑,除非我将页面标记为Googling两次找不到文档页面,其中大部分内容并不容易导航.
我发现cv::Mat::at(..)要访问Matrix元素,但我记得C OpenCV至少有3种不同的方式来访问元素,所有这些方法都用于不同的目的...不记得用于哪些:/
因此,虽然逐个元素复制Matrix肯定会起作用,但我正在寻找一种更有效的方法,如果可能的话,比每行的for循环更优雅一些.
我很困惑为什么我的代码没有产生错误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) 我观看了动态编程 - Kapsack问题(YouTube).但是,我正在解决一个稍微不同的问题,其中约束是预算,价格,是双倍,而不是整数.所以我想知道如何修改它?双是"连续"不像整数,我可以有1,2,3 ....我不认为我做0.0,0.1,0.2 ......?
更新1
我想通过乘以100将double转换为int.Money只有2位小数.但这意味着价值范围会非常大?
更新2
我需要解决的问题是:
物品具有价格(双倍)和满意度(整数)值.我有预算作为约束,我需要最大化满意度.
在youtube视频中,作者创建了两个2d数组,如int [numItems] [possibleCapacity(weight)].在这里,我不能预算是一个双重不整数
我的代码中的一些断言刚开始表现得很奇怪,我想知道是否有人之前有过类似的情况.一个简短的代码片段,如:
#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接口,但由于这个问题复杂化,我只会更详细,如果社会认为它相关的编辑.
我想创建一个记录来保存有关的信息
在树的节点中.我会明确地仅存储叶节点信息,而父节点中的信息可以通过结合这一切的信息获取的孩子(如儿童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()存在的函数,大小给出了存储的正确数量的对象种类,但访问不存在的元素会无意中增加大小)谢谢你的建议!
我正在使用包含有符号整数数据的TIF图像.成功输入并处理后,我需要以相同的格式输出图像(输入和输出*.tif文件).
对于输入,我知道OpenCV不知道数据是有符号还是无符号,所以它假设是无符号的.使用这个技巧解决了这个问题(切换cv::Mat手工类型).
但是,当我输出图像并再次加载时,我没有得到预期的结果.该文件包含多个段(像素组),格式如下(我必须使用此格式):
-99991,第二段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个段).
首先,我知道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是(构造函数和析构函数除外).
所以,我现在的问题是我想做的事情如下 …
将嵌套std::vector的std::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)
嵌套向量怎么样?
假设我有一个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) 我正在尝试在经过稍微修改的SegNet-basic模型Caffe中训练网络。
我知道Check failed: error == cudaSuccess (2 vs. 0) out of memory我得到的错误是由于我的GPU内存用完了。但是,令我困惑的是:
我的“旧”训练尝试效果很好。网络初始化并运行,内容如下:
Memory required for data: 1800929300(这是按批次大小计算的,因此这里是4x样本大小)7x7每层内核大小的64个过滤器。令我感到惊讶的是,我的“新”网络内存不足,并且由于减小了批处理大小,所以我不知道正在保留额外的内存是什么:
Memory required for data: 1175184180 (=样本数量)通过累加每层尺寸数获得的分层参数,该脚本可以计算出参数数量。
假设每个参数需要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)