我正在编写一个与OpenCV结合的Qt GUI程序来创建人员跟踪应用程序。 OpenCV有很多以矩阵作为输入和输出的函数,例如颜色转换:
cvtColor(inputArray src,outputArray dst,int code,int dstCn = 0);
Mat是OpenCV的默认矩阵类,假设我有一个名为frame的Mat对象,我会实现这样的函数来改变它的属性:
cvtColor(frame,frame,CV_RGB2HSV,0);
在任何函数上使用相同的变量作为输入和输出是否有任何缺点?或者我应该先创建一个副本?
或者我应该查看每个功能文档?
答案 0 :(得分:0)
我认为这是个人选择。以下是一些个人样本:
获取只读输入,对输出的引用,并在处理输入后将其推送到输出。可选的错误结果友好。
bool function(const type& input, type& output){
output = input;
return true;
}
获取只读输入,将其分配给输出,更改输出并将其返回(C ++ 11移动优化)。
type function(const type& input){
type output = input;
return output;
}
type output = function(input);
在这里,您强制将对象的新副本作为参数,并且可以使用它并将其返回(当您不想更改副本时,最好使用C ++ 11)。 See also: Want speed, pass by value.
type function(type input){
// modify input
return input;
}
type output = function(input);
在同一个参数中输入和输出。谨慎使用。可以返回错误。
bool函数(类型& put){ 返回true; }
这取决于您的设计。不需要错误?...使用可移动的错误?需要错误?...使用一个让您可以访问返回值的错误。或者,只需遵循现有的做法,但要知道每个人可以如何帮助或惩罚您的表现:
// this makes a pointless copy for the input (use const ref here)
bool function(type input, type& output){
output = input;
return true;
}
(正确的方法)
bool function(const type& input, type& output){
output = input;
return true;
}
PS :自学C ++开发者的个人观点:))
答案 1 :(得分:0)
这是个人选择。如果您以后不需要输入图像,那么一定要这样做。 我已经尝试过了,它大部分时间都有效,但有些时候效果很差。 这取决于你正在使用的功能。