我有两个班级。
class NeuroShield
{
public:
NeuroShield();
uint16_t begin();
void setNcr(uint16_t value);
uint16_t getNcr();
void setComp(uint8_t value);
uint8_t getComp();
void setLastComp(uint8_t value);
void setIndexComp(uint16_t value);
uint16_t getDist();
void setCat(uint16_t value);
uint16_t getCat();
void setAif(uint16_t value);
uint16_t getAif();
void setMinif(uint16_t value);
uint16_t getMinif();
void setMaxif(uint16_t value);
uint16_t getMaxif();
uint16_t getNid();
void setGcr(uint16_t value);
uint16_t getGcr();
void resetChain();
void setNsr(uint16_t value);
uint16_t getNsr();
uint16_t getNcount();
void setPowerSave();
void forget();
void forget(uint16_t maxif);
void countTotalNeurons();
void clearNeurons();
void setContext(uint8_t context);
void setContext(uint8_t context, uint16_t minif, uint16_t maxif);
void getContext(uint8_t* context, uint16_t* minif, uint16_t* maxif);
void setRbfClassifier();
void setKnnClassifier();
uint16_t broadcast(uint8_t vector[], uint16_t length);
uint16_t learn(uint8_t vector[], uint16_t length, uint16_t category);
uint16_t classify(uint8_t vector[], uint16_t length);
uint16_t classify(uint8_t vector[], uint16_t length, uint16_t* distance, uint16_t* category, uint16_t* nid);
uint16_t classify(uint8_t vector[], uint16_t length, uint16_t k, uint16_t distance[], uint16_t category[], uint16_t nid[]);
void readNeuron(uint16_t nid, uint16_t model[], uint16_t* ncr, uint16_t* aif, uint16_t* cat);
void readNeuron(uint16_t nid, uint16_t nuerons[]);
uint16_t readNeurons(uint16_t neurons[]);
void readCompVector(uint16_t* data, uint16_t size);
void writeNeurons(uint16_t neurons[], uint16_t ncount);
void writeCompVector(uint16_t* data, uint16_t size);
uint16_t testCommand(uint8_t read_write, uint8_t reg, uint16_t data);
uint16_t fpgaVersion();
void nm500Reset();
void ledSelect(uint8_t data);
uint16_t total_neurons;
private:
uint16_t support_burst_read = 0;
};
另一个类是来自opencv的Parallel_process。
class Parallel_process : public cv::ParallelLoopBody
{
private:
Mat gray_img;
Mat orig_img;
int size;
int row;
NeuroShield hnn;
vector<uint16_t> dists;
public:
uint16_t nm_cat, nm_nid;
Parallel_process(Mat inputImgage, Mat orgImg, int row_, NeuroShield &hnn_) : gray_img(inputImgage), row(row_), hnn(hnn_){}
virtual void operator()(const Range& range) const
{
for (int col = range.start; col < range.end; col = col +2)
{
uint8_t vector[NEURON_SIZE];
Mat roi_img = gray_img(Rect(col, row, size, size));
Mat res;
resize(roi_img, res, Size(16, 16), 0, 0, INTER_LINEAR);
uint8_t* data = (uint8_t*)res.data;
for (int j = 0; j < VECTOR_SIZE; j++)
vector[j] = *data++;
uint16_t nm_dist;
hnn.classify(vector, VECTOR_SIZE, &nm_dist, &nm_cat, &nm_nid);
dists.push_back(nm_dist);
}
}
};
在主函数中,并行过程称为
cv::parallel_for_(cv::Range(0, 8), Parallel_process(inputImgage, orgImg, row_, hnn, dists_))
但是在以下两行中有两个编译错误。
hnn.classify(vector, VECTOR_SIZE, &nm_dist, &nm_cat, &nm_nid);
dists.push_back(nm_dist);
错误是
Error C2663 'NeuroShield::classify': 3 overloads have no legal conversion for 'this' pointer
Error C2663 'std::vector<uint16_t,std::allocator<_Ty>>::push_back': 2 overloads have no legal conversion for 'this' pointer
怎么了?
答案 0 :(得分:3)
您不能在调用它的const
限定函数内修改实例。 *)
从const
删除Parallel_process::operator()()
限定符。
*)缺少声明为可变的成员。
答案 1 :(得分:3)
Parallel_process
类继承自cv::ParallelLoopBody
,
所以你必须重写
virtual void operator()(const Range& range) const
^^^^^
const
限定符意味着无法在此方法内修改任何数据成员。
NeuroShield hnn;
被通话修改
hnn.classify(vector, VECTOR_SIZE, &nm_dist, &nm_cat, &nm_nid);
因为classify
的{{1}}方法是非常量的。您可以将NeuroShield
方法设置为classify
,这样编译器就不会抱怨。
第二个问题是const
。仅当您向其添加vector<uint16_t> dists;
说明符时,operator()()
才能修改此向量。
mutable
以上全部解释了为什么您的代码无法编译。
代码中的主要问题是使用mutable vector<uint16_t> dists;
的方式。
正确的方法是:
准备将结果存储在其中的容器
通过引用/指针将此容器传递给从cv::ParallelLoopBody
现在在cv::ParallelLoopBody
中,您可以修改引用/指针指向的数据
[指针不会更改,但指向的数据可以更改-这是解决问题的关键]
所以
operator()() const
ctor:
int size;
int row;
NeuroShield& hnn; // make reference
vector<uint16_t>& dists; // make reference
现在这些行
Parallel_process(Mat inputImgage, Mat orgImg, int row_, NeuroShield &hnn_, vector<uint16_t>& vec) :
gray_img(inputImgage),
row(row_),
hnn(hnn_),
dists(vec) {}
应该工作。在访问 hnn.classify(vector, VECTOR_SIZE, &nm_dist, &nm_cat, &nm_nid);
dists.push_back(nm_dist);
向量时,可能应该使用某种同步方法,因为此代码是同时运行的。