测试opencv2.4.9中Mat3通道图像的灰度值存储方式

来源:互联网 发布:mac截屏的快捷键是什么 编辑:程序博客网 时间:2024/06/06 05:26

简单测试Mat中3通道图像的像素值存储方式

void testChannels(Mat src,Mat &dst,float slope,float intercept){    int M = 0;    int N = 0;    if(src.empty()){        std::cout<<"Src pic is empty\n"<<std::endl;        return;    }    M = src.rows;    N = src.cols;        int nn = src.channels();        printf("channel:%d\n",nn);    int j = 0;    float gray = 0;    for(int i = 0;i < M;i++){        for(j = 0; j < N; j++){            uchar tmp = 0;            gray = (float)src.at<uchar>(i,j*nn);            gray = slope*((float)(1+gray)) + intercept;            tmp = saturate_cast<uchar>(gray);            dst.at<uchar>(i,j*nn) = tmp;            gray = (float)src.at<uchar>(i,j*nn+1);            gray = slope*((float)(1+gray)) + intercept;            tmp = saturate_cast<uchar>(gray);            dst.at<uchar>(i,j*nn+1) = tmp;            //gray = (float)src.at<uchar>(i,j*nn+2);              //gray = slope*((float)(1+gray)) + intercept;              //tmp = saturate_cast<uchar>(gray);            //dst.at<uchar>(i,j*nn+2) = tmp;        }    }}int main( int argc, const char** argv ){printf("ok\n");    Mat image;    if( argc != 2)    {        printf( "No input image file \n" );        return 1;    }    image = imread( argv[1], 1 );        printf("argc:%d is ok\n",argc);    if( !image.data )    {        printf( "No image data \n" );        return -1;    }    Mat resimg;    Mat mat2;    mat2 = imread( argv[1], 1 );    testChannels(image,mat2,-1,255);    //Canny边缘检测    //    Canny(image, resimg, 50, 200);   //Mat img = imread("box_in_scene.png");     SIFT sift;    //实例化SIFT类     vector<KeyPoint> key_points;    //特征点     //descriptors为描述符,mascara为掩码矩阵             Mat descriptors, mascara;   Mat output_img;    //输出图像矩阵     sift(image,mascara,key_points,descriptors);    //执行SIFT运算     //在输出图像中绘制特征点     drawKeypoints(image,     //输入图像                     key_points,      //特征点矢量                     output_img,      //输出图像                     Scalar::all(-1),      //绘制特征点的颜色,为随机                     //以特征点为中心画圆,圆的半径表示特征点的大小,直线表示特征点的方向                     DrawMatchesFlags::DRAW_RICH_KEYPOINTS);   imwrite("test_output.jpg",output_img);   imwrite("out2.jpg",mat2);   return 0;}

关键的代码就看中间处理处理像素值的地方

            gray = (float)src.at<uchar>(i,j*nn);            gray = slope*((float)(1+gray)) + intercept;            tmp = saturate_cast<uchar>(gray);            dst.at<uchar>(i,j*nn) = tmp;


说明M 行N 列的图像,3通道时M行不变,列数据其实是channels*N列,所以第n列的3通道数据分别为n*channels、n*channels+1、n*channels+2

阅读全文
0 0
原创粉丝点击