简单测试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;