【发布时间】:2017-06-06 07:33:06
【问题描述】:
我有这个方法:
//codeSize previously defined
void generateRow(cv::Mat1f &row){
if(row.cols != codeSize || !row.isContinous() || row.rows!=1)
return;
//fill row somehow
}
我想这样称呼它:
cv::Mat1f mat(rows,cols);
for(size_t i=0; i<rows; i++)
generateRow(mat.row(i));
但我收到此错误消息:
../EncoderManager.cpp:100:37: error: invalid initialization of non-const reference of type ‘cv::Mat1f& {aka cv::Mat_<float>&}’ from an rvalue of type ‘cv::Mat_<float>’
我该如何解决这个问题?
可能的解决方案:
for(size_t i=0; i<rows; i++){
cv::Mat1f row(1,cols);
generateRow(row);
row.row(1).copyTo(mat.row(i));
}
这是唯一的解决方案吗?如果是这样并且如果rows 很大,这将是超级低效的!
原始代码:
调用方法:
encoder->encode(imgDesc,code);
调用的方法:
void Encoder::encode(cv::Mat1f &descriptors, cv::Mat1f &code){
if(!checkCode(code) || !checkRows(code,1) || !checkDescriptors(descriptors)){
throw std::runtime_error("wrong descriptors");
return;
}
encode_(descriptors, code);
}
错误:
../EncoderManager.cpp: In member function ‘void EncoderManager::GenerateSampledCodes(cv::Mat1f&, int, const string&, const string&, const string&)’:
../EncoderManager.cpp:104:37: error: invalid initialization of non-const reference of type ‘cv::Mat1f& {aka cv::Mat_<float>&}’ from an rvalue of type ‘cv::Mat_<float>’
encoder->encode(imgDesc,codes.row(i));
^
In file included from ../EncoderManager.hpp:11:0,
from ../EncoderManager.cpp:10:
../Encoder.hpp:21:7: note: initializing argument 2 of ‘void Encoder::encode(cv::Mat1f&, cv::Mat1f&)’
void encode(cv::Mat1f &descriptors, cv::Mat1f &code);
【问题讨论】:
-
您可以将
cv::Mat1f mat的指针或引用连同行索引一起传递到generateRow以避免不必要的复制。 -
@alexisrozhkov 你能写一个答案吗?我不确定我是否理解您的解决方案
-
我尝试了您的代码,它对我来说可以正常工作。你能发一个minimal reproducible example吗?
code在哪里定义?是全局变量吗? -
对不起@Miki,我只是发布了一小部分代码,因为其余部分非常复杂,我不明白它怎么可能编译并为你工作..顺便说一句你同意我们不能用上面的代码逐行填充矩阵吗?
-
实际上,我正在尝试了解您如何无法填充矩阵,因为这应该可以正常工作;)