代码之家  ›  专栏  ›  技术社区  ›  AHF

Mat的C++代码转换

  •  1
  • AHF  · 技术社区  · 12 年前

    我正在尝试转换 this second answer 代码转换成c++,我所做的是没有给我适当的结果,下面是我的代码:

    {
    Mat img = imread("messi5.jpg");
    int level_n = 2;
    Mat p = Mat::zeros(img.cols*img.rows, 3, CV_32F);
    vector<Mat> bgr;
        cv::split(img, bgr);
        //Divide each pixel color with 127 for level 2
        for(int i=0; i<img.cols*img.rows; i++) {
            p.at<float>(i,0) = bgr[0].data[i] / 127.0;
            p.at<float>(i,1) = bgr[1].data[i] / 127.0;
            p.at<float>(i,2) = bgr[2].data[i] / 127.0;
        }
    vector<Mat> Img2 = p[bgr];
    Mat out;
    cv::transform(img,out,p);
    imshow ("output" , out);
    }
    

    我不明白的是,我是如何将这些颜色除以127后,放入矩阵中的,我错在哪里了?

    我正在尝试的另一种方式是

    vector<Mat> bgr;
    Mat blue , green , red;
        cv::split(img, bgr);
        blue = bgr[0]/127.0;
        if (blue > 128)
        {
            blue = 255;
        }
        else
        {
            blue = 0;
        }
    

    红色和绿色相同

    1 回复  |  直到 9 年前
        1
  •  1
  •   marol    12 年前

    为什么不直接执行(对于级别2):

    Mat img = imread("messi5.jpg");
    for(int i=0;i<img.rows;i++)
        for(int j=0;j<img.cols;j++) {
            cv::Vec3b p = img.at<cv::Vec3b>(i,j);
            for(int k = 0;k < img.channels();k++)
                 p[k] = p[k] > 127 ? 255 : 0;
            img.at<cv::Vec3b>(i,j) = p;
    }
    // do whatever you want with processed image img