我发现了一个非常类似的话题:如何将opencv cv :: Mat转换为qimage,但它并没有解决我的问题.
我有功能将cv :: Mat转换为QImage
QImage cvMatToQImg(cv::Mat& mat)
{
cv::Mat rgb;
if(mat.channels()==1)
{
cv::cvtColor(mat,rgb,CV_GRAY2BGR);
cv::cvtColor(rgb,rgb,CV_BGR2BGRA);
QImage temp = QImage((unsigned char*)(rgb.data), rgb.cols,
rgb.rows,QImage::Format_ARGB32 );
QImage returnImage = temp.copy();
return returnImage;
}
Run Code Online (Sandbox Code Playgroud)
它适用于我,但我想让它更有效率.第一:为什么更改2个cvtColor函数:
cv::cvtColor(mat,rgb,CV_GRAY2BGRA)
Run Code Online (Sandbox Code Playgroud)
失败了
QImage returnImage = temp.copy()
Run Code Online (Sandbox Code Playgroud)
与segfault.
那么如何消除QImage的复制.当我简单地返回临时图像时,我会遇到段错误.
那里可以做任何其他优化吗?它经常被使用,所以我希望尽可能快地使用它.
我正试图在Windows上的Qt Creator中设置ccache.
不幸的是,我找不到任何好的指示.如何让它工作?
我在Cygwin上安装了ccache.
编辑:
我试过添加
QMAKE_CXX+="ccache g++"
Run Code Online (Sandbox Code Playgroud)
作为qmake构建步骤中的附加参数.
但是在编译输出中,我仍然有"g ++ -c -g -Wall ...",我想它应该是"ccache g ++ ..."
我想计算OpenCV中函数的相位相关性.我找到了http://nashruddin.com/phase-correlation-function-in-opencv.html但是有一些其他的库,我想用OpenCV来做.
我的问题是不同的,因为我想计算两个数组的相位相关,两个360元素.我试图从文档中评估如何做,但我不知道我的方法是否良好.我的R矩阵没有规范化,如何规范化它是否有必要?如果你给我一些例子,我将不胜感激.我执行此任务的功能:
void calcPhaseCorrelation(int* x1, int* x2){
Mat array1 = Mat(1,360,DataType<float>::type);
Mat array2 = Mat(1,360,DataType<float>::type);
uchar* begin = array1.data;
uchar* end = begin + (array1.step.p[0]/ sizeof(float)) * array1.size().height;
uchar *ptr = begin;
int ctr1 = 0, ctr2 = 0; //control in loops
while(ptr<end)
{
*ptr = (float)x1[ctr1];
ctr1++;
ptr++;
}
begin = array2.data;
end = begin + (array2.step.p[0]/ sizeof(float)) * array2.size().height;
ptr = begin;
while(ptr<end)
{
*ptr = x2[ctr2];
ctr2++;
ptr++;
}
Mat outputArray;
outputArray.create(abs(array1.rows - array2.rows)+1,
abs(array1.cols …Run Code Online (Sandbox Code Playgroud) 对于函数中使用的所有临时向量使用一个向量类成员,从内存管理站点看起来有什么区别:
class A
{
private:
vector<Type> m_vector;
}
void fnc()
{
m_vector.clear();
m_vector.push_back();
//further operations on vector
}
Run Code Online (Sandbox Code Playgroud)
并在函数内创建临时向量:
void fnc()
{
vector<Type> vector;
//further operations on vector
}
Run Code Online (Sandbox Code Playgroud)
我认为第一个选项导致较少的内存碎片,因为我们正在进行一次分配并使用此区域,在第二种情况下,我们为不同函数的向量分配内存,这会导致内存碎片.
这个向量用法的优点和缺点是什么?当我的课程在其功能中需要很多向量时,我应该使用哪一个?从记忆管理网站看哪一个更好看?
我有 std::vector<type> myVector
让我们说内容是:
el1, el2, el3, splitElement, el4,el5
Run Code Online (Sandbox Code Playgroud)
我分裂splitElement成split1和split2
我想有载体:
split2, el4, el5, el1, el2, el3, split1
Run Code Online (Sandbox Code Playgroud)
Split2应该是开始,split1结束.其他元素顺序应该与示例相同.让我们将矢量视为链.我想插入两个元素和移位链来制作split2第一个元素.使用stl实现它的优雅有效方法是什么?
我现在的快速代码(这是非常难看的解决方案):
std::vector<type> before;
std::vector<type> after;
bool afterBool = false;
for(std::vector<type>::iterator it = myVector.begin(); it != myVector.end(); it++)
{
if(*it == splitElement)
{
afterBool = true;
before.push_back(split1);
after.push_back(split2);
}
else if(afterBool)
after.push_back(*it);
else
before.push_back(*it);
}
myVector.clear();
for(std::vector<type>::iterator it = after.begin(); it != after.end(); it++)
myVector.push_back(*it);
for(std::vector<type>::iterator it = before.begin(); it != before.end(); it++)
myVector.push_back(*it);
Run Code Online (Sandbox Code Playgroud)
我添加它只是因为我不想在没有任何代码的情况下离开主题.
如何做得很好?
我需要从c ++对象解析并生成一些文本.
语法是:
command #param #param #param
Run Code Online (Sandbox Code Playgroud)
有一组命令,其中一些没有参数等.参数主要是数字.
问题是:我应该使用Boost Spirit来完成这项任务吗?或者只是简单地将每行评估函数标记为从字符串比较命令,读取其他参数并从中创建cpp对象?
如果你建议使用Spirit或任何其他解决方案,如果你能提供一些与我的问题类似的例子,那将是很好的.我已阅读并尝试了Boost Spirit doc中的所有示例.
c++ ×4
opencv ×2
qt ×2
vector ×2
boost-spirit ×1
ccache ×1
parsing ×1
qt-creator ×1
refactoring ×1
stl ×1
tokenize ×1