天天看點

OpenCV中使用指針周遊Mat像素

使用Mat.at<uchar>(row,col)的方法速度太慢,使用指針周遊的方法速度快!

以下例子是用于何凱明去霧算法中暗通道的提取方法,取三通道圖像src中每個通道對應位置的像素最小值,作為dst的對應像素值。

void GetDarkChannelMat(Mat src, Mat* dst)
{
	vector<Mat> vecChannels(src.channels());
	split(src, vecChannels);
	uchar minPixel = 0;

	for (int i = 0; i < src.rows; i++)
	{
		uchar* pData_b = vecChannels[0].ptr<uchar>(i);
		uchar* pData_g = vecChannels[1].ptr<uchar>(i);
		uchar* pData_r = vecChannels[2].ptr<uchar>(i);
		uchar* pData_dst = dst->ptr<uchar>(i);

		for (int j = 0; j < src.cols; j++)
		{
			uchar data_b = *pData_b++;
			uchar data_g = *pData_g++;
			uchar data_r = *pData_r++;

			pData_dst[j] = data_b < data_g ? 
                           (data_b < data_r ? data_b : data_r) : 
                           (data_g < data_r ? data_g : data_r);
		}
	}
}
           

繼續閱讀