注:Opencv 的 Mat 类中没有对矩阵的某一列进行单独处理的成员函数,下面使用两个函数对矩阵的某一列或多列进行删除操作;
(1)删除矩阵中的指定列——删除某一列
/*******************删除矩阵中指定的列************************/
void delete_col(Mat& arr, int num)
{
if (num < 0 || num >= arr.cols)
{
cout << " 所删除的列索引不合法! " << endl;
}
else
{
//删除列是矩阵的最后一列
if (num == arr.cols - 1)
{
arr = arr.t(); //求逆矩阵
arr.pop_back(); //弹出最后一行元素
arr = arr.t();
}
//num 列之后的所有数据前移一列
for (int i = num + 1; i < arr.cols; i++)
{
arr.col(i - 1) = arr.col(i) + Scalar(0, 0, 0, 0);
}
arr = arr.t();
arr.pop_back();
arr = arr.t();
}
}
注:该函数在删除当前列时,当前列之后的所有列都会前移一列,如果利用循环+该函数进行删除指定的多列,会出现 BUG;
(2)删除矩阵中指定列——删除多列
/*******************删除矩阵中多个指定列************************/
/*object 需要进行操作的矩阵
*arrs 删除不合格特征点后的矩阵
*nums 需要删除的列索引 */
void delete_nums_cols(Mat& object, Mat& arrs, vector<int>& nums, int n)
{
arrs.create(2, n, CV_32FC1);
//获取矩阵每一行的首地址
float* p10 = arrs.ptr<float>(0), * p11 = arrs.ptr<float>(1);
float* p20 = object.ptr<float>(0), * p21 = object.ptr<float>(1);
for (int i = 0; i < object.cols; i++)
{
auto it = nums.begin();
for (; it != nums.end(); it++)
{
//if ((*it) < 0 || (*it) >= object.cols)
//{
// cout << " 所删除的列索引不合法! " << endl;
// continue;
//}
if (*it == i)
continue;
p10[i] = p20[i];
p11[i] = p21[i];
}
}
}
注:形参 nums 中存放的列索引是经过升序排序的,且没有考虑列索引重复的情况,如果读者有需要可自行添加;