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