质量差,在qt4中从相机渲染图像时

时间:2015-09-12 06:03:23

标签: c++ qt opencv

我的代码:

camera = new RaspiCam_Cv();//raspbery pi library 

camera->set(CV_CAP_PROP_FORMAT,CV_8UC1); //this is monochrome 8 bit format
camera->set(CV_CAP_PROP_FRAME_WIDTH, 960);
camera->set(CV_CAP_PROP_FRAME_HEIGHT,720);

while (1){
    camera->grab();//for linux
    unsigned char* buff = camera->getImageBufferData();

    QPixmap pic = QPixmap::fromImage(QImage( buff, camWidth_, camHeight_,  camWidth_ * 1, QImage::Format_Indexed8 ));
    label->setPixmap(pic);
}

问题是质量差!我发现问题发生在使用QImage时,使用openCv Mat时,一切都很好!

其他基于Qt的程序也会发生同样的事情,比如这个程序(质量相同):https://code.google.com/p/qt-opencv-multithreaded/

这是一张照片,显示了问题所在。 相机前面有一个白页,所以如果一切都按照原样进行,你应该看到干净的灰色图像

photo of monitor

3 个答案:

答案 0 :(得分:1)

您正在使用像素图和标签转换来调整图像大小,这比QImage更糟糕。这是因为pixmap被优化用于显示而不是其他任何东西。像素图大小应与标签相同,以避免进一步调整大小。

QImage img =QImage( 
    buff, 
    camWidth_, 
    camHeight_,  
    camWidth_ * 1, 
    QImage::Format_Indexed8 ).scaled(label->size());
label->setPixmap(QPixmap::fromImage(img));

答案 1 :(得分:1)

这不是答案,但在评论中分享代码太难了。 你能测试一下这段代码并告诉我结果是好还是坏?

int main(int argc, char** argv)
{ 
    RaspiCam_Cv *camera = new RaspiCam_Cv(); 
    camera->set(CV_CAP_PROP_FORMAT , CV_8UC1) ; 
    camera->set(CV_CAP_PROP_FRAME_WIDTH, 960); 
    camera->set(CV_CAP_PROP_FRAME_HEIGHT,720); 
    namedWindow("Output",CV_WINDOW_AUTOSIZE); 
    while (1) 
    { 
        Mat frame; 
        camera.grab(); 
        //camera.retrieve ( frame); 
        unsigned char* buff = camera->getImageBufferData();
        frame = cv::Mat(720, 960, CV_8UC1, buff);
        imshow("Output", frame); 
        if (waitKey(30) == 27) 
        { cout << "Exit" << endl; break; } 
    } 
    camera->~RaspiCam_Cv(); 
    return 0; 
}

答案 2 :(得分:0)

您提供的图像看起来颜色深度仅为16位。

为了比较,这里提供了拍摄的图像:

enter image description here

并且这里是相同的图像,在IrfanView中转换为16位色彩空间(没有Floyd-Steinberg-Dithering)。

enter image description here

在评论中我们发现Raspberry Pi输出缓冲区设置为16位。并将其设置为24位帮助。

但是我无法解释为什么使用OpenCV $password = "test"; $hash = "$2y$10$fXJEsC0zWAR2tDrmlJgSaecbKyiEOK9GDCRKDReYM8gH2bG2mbO4e"; if (password_verify($password, $hash)) { echo "Success"; } else { echo "Error"; } OR You can use this one too $verify=password_verify($_POST['passwrd'],$row[2]); if($verify){ $_SESSION["usrname"]=$usrname; echo "Correct"; } else { echo "user: " . $usrname. "<br>"; echo "pass: " . $hash. "<br>"; echo "db: " . $row[2]."<br>"; echo "Wrong Username or Password"; } 在pi上渲染图像会在监视器/电视上产生漂亮的图像...