OpenCV.2.Computer.Vision.Application.Programming.Cookbook--Efficient scanning of continuous images

#include<opencv2\opencv.hpp>

void colorReduce(cv::Mat &image, int div=64)
{  
	int nr= image.rows; // number of rows  
	int nc= image.cols * image.channels(); // total number of elements per line  
	if (image.isContinuous())  
	{  
		// then no padded pixels  
		nc= nc*nr;   
		nr= 1;  // it is now a 1D array  
	}  
	int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));  
	// mask used to round the pixel value  
	uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0  
	for (int j=0; j<nr; j++) 
	{  
		uchar* data= image.ptr<uchar>(j);  
		for (int i=0; i<nc; i++) 
		{  
			*data++= *data&mask + div/2;  
		} // end of row                   
	}  
}  

int main(int argc,char* argv[])
{
	cv::Mat pImg;

	pImg=cv::imread("lena.jpg");
	cv::imshow("Image",pImg);

	colorReduce(pImg);

	cv::imshow("pImg",pImg);
	cv::waitKey(0);
	return 0;
}


技术分享

Mat::reshape
在无需复制数据的前提下改变2D矩阵的形状和通道数或其中之一。
C++: Mat Mat::reshape(int cn, int rows=0) const
参数:
cn – 新的通道数。若cn=0,那么通道数就保持不变。
rows –新的行数。 若rows = 0, 那么行数保持不变。

if (image.isContinuous())
	{
		image.reshape(1,image.cols*image.rows);
	}
	int nr= image.rows; // number of rows  
	int nc= image.cols * image.channels(); // total number of elements per line  
和上面一样效果!

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。