OpenCV 2D阵列到图像转换

时间:2017-03-06 04:20:58

标签: c++ arrays opencv pointers

当我尝试将2D数组转换为图像时,行和列会变形。相同的图像不能制作。

using namespace cv;
using namespace std;


int main()
{
     float val;
     int val1[3][3];

     Mat imm = (Mat_<float>(3,3) << 12, 13, 45, 11, 191, 255, 62, 27, 0);
     if (imm.empty()) //check whether the image is loaded or not
     {
         cout << "Error : Image cannot be loaded..!!" << endl;
         //system("pause"); //wait for a key press
         return -1;
     }

     for (int y = 0; y < imm.rows; ++y)
     {
         float* row_ptr = imm.ptr<float>(y);
         for (int x = 0; x < imm.cols; ++x)
         {
              val = row_ptr[x];
              val1[y][x]=val;
              if(x%3==0)
              cout<<"\n";
              cout<<val<<"\t";

         }
     }


     Mat out_img(3,3,CV_8U ,val1);
     cout<<"\n\n\n output= "<<out_img;
     cout<<"\n\n\n\n"<<"Input= "<<imm;
 }

我们获得的输出是,

12  13  45  
11  191 255 
62  27  0   


 output= [ 12,   0,   0;
   0,  13,   0;
   0,   0,  45]



Input= [12, 13, 45;
 11, 191, 255;
 62, 27, 0]

我们可以看到输出和输入不一样。因此需要帮助重建相同的数据。

感谢。

2 个答案:

答案 0 :(得分:0)

输出失真的原因是你试图将2d int(32bit)数组放入unsigned char(8 bit)mat。要更正此问题,您必须将mat类型(CV_8U)更改为CV_32S或将2d数组更改为unsigned char

答案 1 :(得分:0)

Mat im2;
imm.convertTo(CV_8U, im2);

这将为您提供与uchar相同的图像。无需使用double for循环。