注: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 中存放的列索引是经过升序排序的,且没有考虑列索引重复的情况,如果读者有需要可自行添加;