AHF
AHF

Reputation: 1072

C++ code conversion of Mat

I am trying to convert this second answer code into c++ , What I did is not giving me appropriate result , here is my code :

{
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);
}

What I didn't understand is how I put these colour's which I divided by 127 into Matrix , where I am going wrong?

Other way i am trying is

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

same for red and green

Upvotes: 1

Views: 293

Answers (1)

marol
marol

Reputation: 4074

Why don't just do it in place (for level 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

Upvotes: 1

Related Questions