开发者

Qt-OpenCV:How to display grayscale images(opencv) in Qt

I have a piece of code here. This is a camera capture application using OpenCV and Qt(for 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());   

    }
}

Initially "edges" is displayed in red with green background.Then it switches to blue background. This switching is happening randomly. How can I display white edges in a black background in a stable manner.


In short, add the img.setColorTable(colorTable); just before the // display on labelcomment.

For more details, you create your image and affect the color table at the begining of your code:

QImage img;
img.setColorTable(colorTable);

Then in the infinite loop, you are doing the following:

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

What happens is that you destroy the image created at the begining of your code, the color map for this new image is not set and thus uses the default resulting in a colored output.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜