В C ++ с использованием opencv у меня есть массив uint, преобразующий в изображение в градациях серого, показывает только серый экран без изображения - PullRequest
0 голосов
/ 11 октября 2018

Интересно, кто-нибудь может мне помочь с этим.У меня есть массив (один дим), который содержит достаточно значений uint, чтобы заполнить экран размером 120x160.Я хочу загрузить массив в мат и отобразить его в виде изображения в градациях серого.Я не вижу, это может кто-нибудь помочь ??Заранее спасибо.

myarray[39360];
//..
//Code populates values between 0 and 255 to the array
// I have printed the array and the values are all 0 to 255
//..
Mat img,img1;

// load the array into a mat
img(120,160,CV_8UC1,myarray);

// convert the mat to a grayscale image, 3 channel instead of the current 1
img.convertTo(img1,CV_8UC3);
namedWindow("test",WINDOW_AUTOSIZE);
imshow("test",img1);
waitKey(0);

// windows pops up but just shows a gray blank page about mid tone :-(

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Не уверен, почему вы используете Mat с 3 каналами (CV_8UC3 означает 8 байт на пиксель, без знака, 3 канала), если вы хотите получить изображение в градациях серого, вот полный пример того, что вы пытаетесь сделать:

#include "opencv2/highgui.hpp"
#include <vector>
#include <iostream>
#include <ctype.h>
#include <cstdlib>

int main()
{
    //  create a uint8_t array, can be unsigned char too
    uint8_t myArray[120*160];

    //  fill values
    srand(time(0));
    for (int i = 0; i < 120*160; ++i)
    {
        myArray[i] = (rand() % 255) + 1;
    }

    //  create grayscale image
    cv::Mat imgGray(120, 160, CV_8UC1, myArray);

    cv::namedWindow("test", cv::WINDOW_AUTOSIZE);
    cv::imshow("test", imgGray);
    cv::waitKey(0);

    return 0;
}

Пример выходного изображения: enter image description here

0 голосов
/ 11 октября 2018
  • Какой тип myarray?Я предполагаю, unsigned char[].
  • Если вы отображаете img, он отображается правильно?Таким образом, вы можете проверить, если что-то пошло не так перед преобразованием.
  • Преобразование в BGR (то, что вы делаете, ваше преобразование градаций серого в цвет со всеми одинаковыми цветами) неработать таким образом.Вот два варианта:

    cv :: cvtColor (img, img1, cv :: COLOR_GRAY2BGR);

    , что делает то же самое (возможно, в более старых версиях, что-то вроде CV_GRAY2BGR) или создайте массив, содержащий три раза img и используйте cv::merge.

    • Наконец, рассмотрите НЕ преобразование в BGR вообще.Если вам нужно изображение в градациях серого, почему недостаточно 1-канального изображения?Если бы вы сохранили его, используя cv::imwrite, он бы даже занимал меньше места ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...