Qt-OpenCV: Как отображать изображения в градациях серого (opencv) в Qt - PullRequest
1 голос
/ 30 сентября 2011

У меня есть кусок кода здесь.Это приложение для захвата камеры, использующее OpenCV и Qt (для GUI).

void MainWindow::on_pushButton_clicked()
{

    cv::VideoCapture cap(0);

    if(!cap.isOpened()) return;

    //namedWindow("edges",1);
    QVector<QRgb> colorTable;
    for (int i = 0; i < 256; i++) colorTable.push_back(qRgb(i, i, i));

    QImage img;
    img.setColorTable(colorTable);

    for(;;)
    {
        cap >> image;
        cvtColor(image, edges, CV_BGR2GRAY);
        GaussianBlur(edges, edges, cv::Size(7,7), 1.5, 1.5);
        Canny(edges, edges, 0, 30, 3);
        //imshow("edges", edges);
        if(cv::waitKey(30) >= 0) break;

    // change color channel ordering
    //cv::cvtColor(image,image,CV_BGR2RGB);

    img =  QImage((const unsigned char*)(edges.data),
    image.cols,image.rows,QImage::Format_Indexed8);

    // display on label
    ui->label->setPixmap(QPixmap::fromImage(img,Qt::AutoColor));
    // resize the label to fit the image
    ui->label->resize(ui->label->pixmap()->size());   

    }
}

Изначально «края» отображаются красным с зеленым фоном. Затем он переключается на синий фон.Это переключение происходит случайно.Как стабильно отображать белые края на черном фоне.

1 Ответ

3 голосов
/ 30 сентября 2011

Короче говоря, добавьте img.setColorTable(colorTable); непосредственно перед комментарием // display on label.

Для получения более подробной информации вы создаете свое изображение и влияете на таблицу цветов в начале кода:

QImage img;
img.setColorTable(colorTable);

Затем в бесконечном цикле вы делаете следующее:

img =  QImage((const unsigned char*)(edges.data), image.cols, image.rows, QImage::Format_Indexed8);

В результате получается, что вы уничтожаете изображение, созданное в начале вашего кода, цветовая карта для этого нового изображения не устанавливается и, таким образом, используется значение по умолчанию, в результате чего получается цветной вывод.

...