【C++】删除矩阵中的指定列——Opencv Mat 类

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

猜你喜欢

转载自blog.csdn.net/weixin_47156401/article/details/120022590