Как правильно сгладить изображение, используя OpenCV для обработки изображения, а затем снова преобразовать его в Mat? - PullRequest
0 голосов
/ 27 октября 2019

У меня есть изображение, прочитайте, используя "cv :: imread". Мне нужно сгладить его, чтобы я мог использовать CUDA & GPU для ускорения алгоритмов обработки изображений.

Моя проблема: когда я читаю свое изображение, я могу правильно показать его с помощью imshow, однако когда я сглаживаю его и конвертируюэто объект Mat, который будет использоваться с imshow, отображается только часть моего изображения. Размер выходного изображения также неверен, что означает, что некоторые данные действительно потеряны. В чем проблема с моим циклом for?

// The problematic part of my code
// The Camera Man gray test image
const char* img_gray_name = "../../Test_Images/cameraman.tiff";
const char* img_blur_name = "../cameraman-blur.tiff";
const char* image_general_name = "cameraman_blur";
cv::Mat img = cv::imread(img_gray_name);
unsigned long int img_gray_size = img.rows * img.cols * sizeof(uchar);

uchar *h_img_in;// input image, converted to a flat array to be 
                    // processed by GPU
h_img_in = (uchar *)malloc(img_gray_size);

//*************** The bug should be here! ***************//
for (int i = 0; i < img.rows; ++i) {
    for (int j = 0; j < img.cols; ++j) {
        h_img_in[i*img.cols+j] = img.at<uchar>(i, j);
    }
}

Mat img_test;
img_test = Mat(cv::Size(img.cols, img.rows), CV_8U, h_img_in);
imwrite(img_blur_name, img_test);
// create image window named "camera man"
cv::namedWindow(image_general_name);
// show the image on window
cv::imshow(image_general_name, img_test);

PS: я также протестировал новый 2D-массив вместо 1D h_img_in, результат тот же;Это означает, что что-то не так с моим использованием "img.at (i, j)".

...