OpenCV学习心得:Mat传递问题详解
cv::Mat的四种复制操作和cv::Mat作为函数形参的四种形式
一.传值
猜测形参副本
1.可改变原值-点灰度赋值
2.不可改变原值-基础变换(resize、warpAffine),猜测opencv内Mat存在引用计数机制。
尝试改变大小(失败)
改变灰度值(成功)
void DockWidget=::on_pushBtn_clicked()
{
cv::Mat mat=cv::imread("E:/1.tif",cv::IMREAD_GRAYSCALE | cv::IMREAD_ANYDEPTH);
cv::imwrite("E:/1.tif",mat);
cv::Mat matDes;
oeToolMat::Test(mat,matDes);
cv::imwrite("E:/2.tif",mat);
//cv::imshow("2",mat2);
}
尝试改变大小(失败)
void oeToolMat::Test(cv::Mat matSrc,cv::Mat &matDes)
{
matDes=matSrc.clone();
cv::resize(matDes,matSrc,cv::Size(2000,2000));//猜测不可通过参数副本改变原值
//matSrc=matDes; //猜测不可通过参数副本改变原值
}
改变灰度值(成功)
void oeToolMat::Test(cv::Mat matSrc,cv::Mat &matDes)
{
int m_MatType = matSrc.type();
int nRows = matSrc.rows;
int nCols = matSrc.cols;
if(0 == m_MatType){//CV_8UC1
uchar* pDataSrc = NULL;
for (int i = 0; i< nRows; i++)
{
pDataSrc = matSrc.ptr<uchar>(i);
if(pDataSrc ==NULL) continue;
for (int j = 0; j < nCols; j++)
{
pDataSrc[j] = cv::saturate_cast<uchar>(0);//猜测可通过参数副本改变原值
}
}
}
}