尝试使用opencv在C ++中实现一小部分matlab代码

时间:2014-09-01 07:51:02

标签: c++ opencv boost

我正在尝试使用opencv将图像转换为双精度。我试图在c ++中模仿MATLAB中可用的im2double函数。所以,为此我所做的是......

 Mat IMG = imread("lena.bmp");
Size size(8,8);

Mat img,img_re,grey;
cvtColor( IMG, img, CV_BGR2GRAY );

resize(img,img_re,size);
img_re.convertTo( grey, CV_64FC3, 1.0/255.0 );
std::cout<<grey<<std::endl;

unsigned char *input = (unsigned char*)(grey.data);

 grey: [0.3764705882352941, 0.5176470588235293, 0.4352941176470588, 0.8274509803921568;
       0.392156862745098, 0.5254901960784314, 0.7372549019607844, 0.6431372549019607;
       0.4431372549019608, 0.6431372549019607, 0.7176470588235294, 0.5607843137254902;
       0.5333333333333333, 0.3254901960784314, 0.6862745098039216, 0.8431372549019608]

以灰色存储的数据几乎与从matlab获得的数据相似。像素的范围为[0,1]。但是,我的问题从这里开始。我现在想要从'灰色'访问像素值并将其保存到增强矩阵。 所以对于这个我使用..

 for (unsigned i=0; i < height; ++i)
{
    for (unsigned j=0; j < width; ++j )
    {
        image(i,j) = input[grey.step * j + i ];
    }
}

  image:: [4,4]((24,24,144,144),(24,24,144,144),(24,216,144,224),(24,63,144,63))

在此步骤之后,矩阵中的所有值都具有[0,255]的范围。灰度图像在[0,255]之间,但为什么在第一种情况下得到[0,1]之间的值。

1 个答案:

答案 0 :(得分:2)

请远离访问Mat的原始数据&#39;指针,并使用:

grey.at<double>(i,j);

代替。

另外,如果im_re是1通道,灰度图像,你的typeflag是错误的,应该是:

img_re.convertTo( grey, CV_64F, 1.0/255.0 );