OpenCV: выходное изображение синего цвета - PullRequest
1 голос
/ 01 февраля 2020

, поэтому я делаю этот проект, где я делаю отражение изображения на OpenCV (без использования функции переворота), и единственная проблема (я думаю), чтобы завершить sh это, это то, что изображение, которое Предполагается, что он отражается, он становится синим.

Код, который у меня есть (я вынул обычную часть, проблема должна быть здесь):

Mat imageReflectionFinal = Mat::zeros(Size(220,220),CV_8UC3);

for(unsigned int r=0; r<221; r++)
    for(unsigned int c=0; c<221; c++) {
       Vec3b intensity = image.at<Vec3b>(r,c);
       imageReflectionFinal.at<Vec3b>(r,c) = (uchar)(c, -r + (220)/2);
    }

    ///displays images
    imshow( "Original Image", image );
    imshow("Reflected Image", imageReflectionFinal);
    waitKey(0);
    return 0;
}

1 Ответ

3 голосов
/ 01 февраля 2020

Есть некоторые проблемы с вашим кодом. Как уже указывалось, ваши итерационные переменные go превышают фактические размеры изображения. Не используйте жестко закодированные границы, вместо этого вы можете использовать inputImage.cols и inputImage.rows для получения размеров изображения.

Существует переменная (BGR Vec3b), которая установлена, но не используется - Vec3b intensity = image.at<Vec3b>(r,c);

Самое главное, не ясно, чего вы пытаетесь достичь. Линия (uchar)(c, -r + (220)/2); не дает много информации. Кроме того, в каком направлении вы переворачиваете оригинальное изображение? Ось X или Y?

Вот возможное решение, чтобы перевернуть изображение в направлении X:

//get input image:
cv::Mat testMat = cv::imread( "lena.png" );

//Get the input image size:
int matCols = testMat.cols;
int matRows = testMat.rows;

//prepare the output image:
cv::Mat imageReflectionFinal = cv::Mat::zeros( testMat.size(), testMat.type() );

//the image will be flipped around the x axis, so the "target"
//row will start at the last row of the input image:
int targetRow = matRows-1;

//loop thru the original image, getting the current pixel value:
for( int r = 0; r < matRows; r++ ){
    for( int c = 0; c < matCols; c++ ) {
        //get the source pixel:
        cv::Vec3b sourcePixel = testMat.at<cv::Vec3b>( r , c );
        //source and target columns are the same:
        int targetCol = c;
        //set the target pixel
        imageReflectionFinal.at<cv::Vec3b>( targetRow , targetCol ) = sourcePixel;
    }
    //for every iterated source row, decrease the number of
    //target rows, as we are flipping the pixels in the x dimension:
    targetRow--;
}

Результат:

enter image description here

...