精华内容
下载资源
问答
  • 在pyqt5中,使用Qimage显示相机的图像 前言:需要在pyqt5的软件界面上显示相机的图像,但是在CSDN上没有找到相关的方案。在翻阅资料后,写下查阅过程。 1、第一步,搞清相机返回的数据类型 根据打印的数据,相机...

    在pyqt5中,使用Qimage显示相机的图像

    前言:需要在pyqt5的软件界面上显示相机的图像,但是在CSDN上没有找到相关的方案。在翻阅资料后,写下查阅过程。
    1、第一步,搞清相机返回的数据类型
    相机返回数据类型
    根据打印的数据,相机返回的是c_ubyte_Array。查询c_types的官方文档:
    c_ubyte_Array数据类型
    得知,是c的unsigned char数组。也就是说,一个char值表示一个像素点的灰度值。(因为unsigned char长度为0-255,可以代表0-255的灰度值)
    2、搞清楚图像显示在控件中的语法
    Qiamge使用方法
    因此,做一个小实验:在一个图像中,使用字符a进行填充:

    # 例:使用unchar类型的a,填充整幅图像
    string1 = "a"* 40000
    STR = (c_char * 40000)(*bytes(string1, 'utf-8'))  # 把一组100个的字符定义为STR,并转换为bytes类型
    cast(STR, POINTER(c_char))  # 强制将STR转换为字符指针POINTER(c_char)
    image = QImage(STR, 200, 200, QImage.Format_Indexed8)
    self.label.setPixmap(QPixmap.fromImage(image))
    

    结果,获取了一张灰度值为97的图像
    灰度值为97的图像
    证明了可行性。
    或者使用最简单的方法:

    image.fill((97)  # 直接全图显示为97的灰度图
    

    也可以。
    当然,可以显示为彩色:

    image = QImage(200, 200, QImage.Format_RGB888)           # 创建对象
    image.fill(QColor(235, 172, 75))                                             # 填充颜色
    for i in range(0, 29):                                                             #使用setPixelColor,绘制直线
       image.setPixelColor(i, i, QColor(170, 0, 0))
    self.label.setPixmap(QPixmap.fromImage(image))                    # 转化为QPixmap,并显示
    

    显示彩色图片
    实验完毕,在demo中进行验证:

    im = BasicDemo.obj_cam_operation.buf_cache
    width = BasicDemo.obj_cam_operation.st_frame_info.nWidth
    height = BasicDemo.obj_cam_operation.st_frame_info.nHeight
    format = BasicDemo.obj_cam_operation.st_frame_info.enPixelType
    image = QImage(im, width, height, QImage.Format_Indexed8)
    # 在主界面的label上显示相机图像
    self.label.setPixmap(QPixmap.fromImage(image))
    

    经测试,效果OK:
    效果显示
    附:其中涉及到的与c的数据转换
    与c的转换

    展开全文
  • 项目使用Pyqt作为UI框架,使用相机线程捕捉image,并在QGraphicsView中显示,遇到以下问题: 1、采集的数据为nparray数据,需转换为QImage 转换代码如下: img=cv2.resize(src=img,dsize=None,fx=0.2,fy=0.2) img2=cv2....
  • Qt 内存图像数组封装成QImage

    千次阅读 2019-01-07 13:41:35
    当采用Qt开发相机数据采集软件时,势必会遇到采集内存图像并进行处理(如缩放、旋转)操作。如果能够将内存图像数据封装成QImage,则可以利用QImage强大的图像处理功能来进行图像处理,并能很好的进行显示。 在内存...

    当采用Qt开发相机数据采集软件时,势必会遇到采集内存图像并进行处理(如缩放、旋转)操作。如果能够将内存图像数据封装成QImage,则可以利用QImage强大的图像处理功能来进行图像处理,并能很好的进行显示。
    在内存中,8bit灰度图像的宽度有可能不能满足BMP格式需求(为4的倍数),在封装成8bit灰度QImage时,会遇到封装不完整或错误的问题。本人总结了该问题,写了一个封装内存8bit灰度图像数据的C++类。

    其中有借用别人的思路和方法。

    头文件:

    #include <QImage> 
    #include <Windows.h> 
    #include <assert.h> 
    #include <QVector> 
    
    class BufferToQImage
    {
    public:
    	BufferToQImage();
    	~BufferToQImage();
    
    public:
    	QImage Pk8bitGrayToQIm(const unsigned char *pBuffer, const int &bufWidth, const int &bufHight); //将8bit灰度数据封装成QImage 
    
    private:
    	QVector<QRgb> vcolorTable; //生成灰度颜色表 
    
    };

    源文件:

    #include "BufferToQImage.h" 
    
    BufferToQImage::BufferToQImage(void)
    {
    	for (int i = 0; i < 256; i++)
    	{
    		vcolorTable.append(qRgb(i, i, i));
    	}
    }
    
    BufferToQImage::~BufferToQImage(void)
    {
    
    }
    
    /*
    * 函数名:Pk8bitGrayToQIm()
    * 功能:将8bit灰度数据封装成QImage
    * 参数:
    *   pBuffer - 内存数据指针
    *   bufWidth - 内存数据宽度
    *   bufHight - 内存数据高度
    * 返回值:QImage
    * 作者:LYC
    * 时间:2013.6.27
    */
    QImage BufferToQImage::Pk8bitGrayToQIm(const unsigned char *pBuffer, const int &bufWidth, const int &bufHight)
    {
    	//对参数的有效性进行检查 
    	assert((pBuffer != NULL) && (bufWidth > 0) && (bufHight > 0));
    
    	int size = sizeof pBuffer;
    	int biBitCount = 8; //灰度图像像素bit数 
    	int lineByte = (bufWidth * biBitCount / 8 + 3) / 4 * 4; //bmp行byte数(格式宽度,为4的倍数) 
    
     	if (bufWidth == lineByte) //判断图像宽度与格式宽度 
     	{
     		QImage qIm = QImage(pBuffer, bufWidth, bufHight, QImage::Format_Indexed8);  //封装QImage 
     		qIm.setColorTable(vcolorTable); //设置颜色表 
     
     		return qIm;
     	}
     	else
    	{
    		QImage qImage = QImage(pBuffer, bufWidth, bufHight, bufWidth, QImage::Format_Indexed8);  //封装QImage 
    		qImage.setColorTable(vcolorTable); //设置颜色表 
    
    		return qImage;
    	}
    }

     

    展开全文
  • 当采用Qt开发相机数据采集软件时,势必会遇到...如果能够将内存图像数据封装成QImage,则可以利用QImage强大的图像处理功能来进行图像处理,并能很好的进行显示。下面以灰度相机为例,介绍封装方法: 1 2...

    博客转载自:https://blog.csdn.net/lg1259156776/article/details/52318638

    当采用Qt开发相机数据采集软件时,势必会遇到采集内存图像并进行处理(如缩放、旋转)操作。如果能够将内存图像数据封装成QImage,则可以利用QImage强大的图像处理功能来进行图像处理,并能很好的进行显示。下面以灰度相机为例,介绍封装方法:

    1

    2

    3

    第一步:首先根据相机的SDK内的读图像函数,获取图像数据imgData、宽度imgWidth和高度imHeight。

    第二步:申请QImage对象,注意类型是Format_RGB32.

    第三步:利用成员函数setPixel()设置QImage像素。由于相机输出的图像是灰度图像,每一位置的R、G、B分量相等且均等于当前位置的像素值。

    程序如下

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    QImage desImage = QImage(imgWidth,imgHeight,QImage::Format_RGB32); //RGB32 

       

    //RGB分量值 

    int b = 0; 

    int g = 0; 

    int r = 0;  

       

    //设置像素 

    for (int i=0;i<imgHeight;i++) 

        for (int j=0;j<imgWidth;j++) 

        

            b = (int)*(imgDataNew+i*imgWidth+j); 

            g = b; 

            r = g; 

            desImage.setPixel(j,i,qRgb(r,g,b)); 

        

    }

    对于灰度图像数据,如下封装方式是错误的。

    1

    QImage desImage = QImage(imgData, imgWidth, imgHeight, QImage::Format_Indexed8)

    原因是QImage的构造函数中写道:

    1

    Constructs an image with the given width, height and format, that uses an existing memory buffer, data. The width and height must be specified in pixels,data must be 32-bit <br>aligned, and each scanline of data in the image must also be 32-bit aligned.

    8位灰度图封装

    在内存中,8bit灰度图像的宽度有可能不能满足BMP格式需求(为4的倍数),在封装成8bit灰度QImage时,会遇到封装不完整或错误的问题。本人总结了该问题,写了一个封装内存8bit灰度图像数据的C++类

    首先看代码部分:BufferToQImage.h

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    /* 

    * Copyright (c) 2013,中科院苏州医工所 

    * All rights reserved. 

    *  

    * 当前版本:1.0 

    * 作    者:LYC

    * 完成日期:2013年6月27日 

    */ 

       

    #ifndef BUFFERTOQIMAGE_H 

    #define BUFFERTOQIMAGE_H 

       

    #include <QImage> 

    #include <Windows.h> 

    #include <assert.h> 

    #include <QVector> 

       

    class BufferToQImage 

    public

        BufferToQImage(void); 

        ~BufferToQImage(void); 

       

    public

        QImage Pk8bitGrayToQIm(const BYTE *pBuffer, const int &bufWidth, const int &bufHight); //将8bit灰度数据封装成QImage 

       

    private

        QVector<QRgb> vcolorTable; //生成灰度颜色表 

       

    }; 

       

    #endif 

    //BufferToQImage.cpp

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    70

    /* 

    * Copyright (c) 2013,中科院苏州医工所 

    * All rights reserved. 

    *  

    * 摘    要:将内存数据封装成QImage。

    *  

    * 当前版本:1.0 

    * 作    者:LYC

    * 完成日期:2013年6月27日 

    */ 

       

    #include "BufferToQImage.h" 

       

    BufferToQImage::BufferToQImage(void

        for (int i = 0; i < 256; i++) 

        

            vcolorTable.append(qRgb(i, i, i)); 

        

       

    BufferToQImage::~BufferToQImage(void

       

       

    /*

    * 函数名:Pk8bitGrayToQIm()

    * 功能:将8bit灰度数据封装成QImage

    * 参数:

    *   pBuffer - 内存数据指针

    *   bufWidth - 内存数据宽度

    *   bufHight - 内存数据高度

    * 返回值:QImage

    * 作者:LYC

    * 时间:2013.6.27

    */ 

    QImage BufferToQImage::Pk8bitGrayToQIm(const BYTE *pBuffer, const int &bufWidth, const int &bufHight) 

        //对参数的有效性进行检查 

        assert((pBuffer != NULL) && (bufWidth>0) && (bufHight>0)); 

       

        int biBitCount = 8; //灰度图像像素bit数 

        int lineByte = (bufWidth * biBitCount/8 + 3) / 4 * 4; //bmp行byte数(格式宽度,为4的倍数) 

       

        if (bufWidth == lineByte) //判断图像宽度与格式宽度 

        

            QImage qIm = QImage(pBuffer, bufWidth, bufHight, QImage::Format_Indexed8);  //封装QImage 

            qIm.setColorTable(vcolorTable); //设置颜色表 

       

            return qIm;  

        

        else 

        

            BYTE *qImageBuffer = new BYTE[lineByte * bufHight]; //分配内存空间 

            uchar *QImagePtr = qImageBuffer; 

       

            for (int i = 0; i < bufHight; i++) //Copy line by line 

            

                memcpy(QImagePtr, pBuffer, bufWidth); 

                QImagePtr += lineByte; 

                pBuffer += bufWidth; 

            }   

       

            QImage qImage = QImage(qImageBuffer, bufWidth, bufHight, QImage::Format_Indexed8);  //封装QImage 

            qImage.setColorTable(vcolorTable); //设置颜色表 

               

            return qImage; 

        

    利用我的博客中**任意宽度灰度BMP图像读写 V2 ** 的程序,可以读取任意宽度的图像,选择能够返回有效图像数据的成员函数,可以模拟相机写入内存中的数据。我利用rd8BitBmpNtFmt()读取78*86的图像,利用上述成员函数将内存的图像数据封装成QImage,并原尺寸显示和512*512放大显示,效果如下

     

    展开全文
  • Pyqt QImage 与 np array 转换

    万次阅读 2017-05-08 17:31:30
    项目使用Pyqt作为UI框架,使用相机线程捕捉image,并在QGraphicsView中显示,遇到以下问题: 1 采集的数据为nparray数据,需转换为QImage 转换代码如下: img=cv2.resize(src=img,dsize=None,fx=0.2,fy=0.2) img2=cv2....

    项目使用Pyqt作为UI框架,使用相机线程捕捉image,并在QGraphicsView中显示,遇到以下问题:
    1 采集的数据为nparray数据,需转换为QImage 转换代码如下:
    img=cv2.resize(src=img,dsize=None,fx=0.2,fy=0.2)
    img2=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    self._image = QtGui.QImage(img2[:],img2.shape[1], img2.shape[0],img2.shape[1] * 3, QtGui.QImage.Format_RGB888)
    注意:QImage(uchar * data, int width, int height, int bytesPerLine, Format format) 中的bytesPerLine 参数不能省略,负责造成Qimage数据错误,显示图片不正常,此参数设置为image的width*image.channels

    2 采集数据的线程为非UI线程,则在QGraphicsView中显示时不仅需要添加Item对象,并且更新显示线程需在UI线程中,否则QGraphicsView不会主动更新显示,使用信号将image放到UI线程中更新即可

    3 保证在UI更新时,所需更新的image还未被销毁,由于处于不同的线程,所以image可存储于更新前不会被销毁的对象中

    展开全文
  • 将内存图像数据封装成QImage V2

    千次阅读 2013-06-28 10:02:37
    当采用Qt开发相机数据采集软件时,势必会遇到采集内存图像并进行处理(如缩放、旋转)操作。如果能够将内存图像数据封装成QImage,则可以利用QImage强大的图像处理功能来进行图像处理,并能很好的进行显示。 在内存...
  • 如何将内存图像数据封装成QImage V1

    千次阅读 2013-06-08 14:16:20
    如何将内存图像数据封装成QImage  当采用Qt开发相机数据采集软件时,势必会遇到采集内存图像并进行处理(如缩放、旋转)操作。如果能够将内存图像数据封装成QImage,则可以利用QImage强大的图像处理功能来进行图像...
  • 如何将内存图像数据封装成QImage 当采用Qt开发相机数据采集软件时,势必会遇到采集内存图像并进行处理(如缩放、旋转)操作。如果能够将内存图像数据封装成QImage,则可以利用QImage强大的图像处理功能来进行图像...
  • 当采用Qt开发相机数据采集软件时,势必会遇到采集内存图像并进行处理(如缩放、旋转)操作。如果能够将内存图像数据封装成QImage,则可以利用QImage强大的图像处理功能来进行图像处理,并能很好的进行显示。 在内存...
  • 现在数码相机拍摄图片都有拍摄方向,水平、垂直拍摄,拍摄后,图像内容会保存相应的信息,我们可以获取这些信息,对图像做展示,不然你会发现,一张图片,90度拍摄后,QImage加载会发生90度旋转,我测试如果不做处理...
  • 二值化的图像转化成QImage

    千次阅读 2018-03-24 19:49:01
    之前还做过GIGE相机的raw格式转换为OpenCV格式,一开始觉得很不好下手,但其实图像都会遵循标准的,,不要慌,仔细看文档,看清楚是什么格式后就能发现转换的办法 代码如下[cpp] view plain copyvoid MainWindow...
  • 最近在VS2010中用QT写一个小的程序,现在出现了一个问题实在不知道怎么解决...将QImage转为QPixmap,再用QPixmap的save函数就可以了,中间也没有什么损耗
  • QImage Camera::VideoCamera(){ Mat openCvImage; try { // 开始抓取c_countOfImagesToGrab images. //相机默认设置连续抓取模式 cameraM.StartGrabbing(c_countOfImagesToGrab, GrabStrategy_Latest...
  • QML相机实例实际上具有一个QVariant元素,只能通过C进行访问,可以将其转换为QCamera *: camera_ = qvariant_cast(qmlCamera->property("mediaObject")); 那么您所要做的就是将探头连接到实际处理QVideoFrames的插槽...
  • 您所需QImage::Format_Grayscale8就是使用Qt 5.5(2015年中)以来可用的QImage::Format_Grayscale8 。无论如何,您真正想要的是一种从XI_IMG到QImage 。 默认BP_UNSAFE缓冲策略应该是充足的-在QImage会做格式转换,...
  • 使用pyqt5开发海康工业相机

    热门讨论 2020-10-25 22:27:34
    使用Qimage显示相机的图像总结 前言 学习完毕pyqt5后,自己做一个工业机器视觉的项目。第一步先学会工业相机的开发。因为海康相机的市场占有量较大,开发文档丰富,且最新的MVS提供了python的开发实例,所以在此...
  • 系列文章目录 文章目录 目录 系列文章目录 文章目录 前言 二、使用海康工业相机API接口GetImagebuffer配合pyqt中的QImage类进行界面显示 1.海康工业相机API接口GetImagebuffer介绍 2.在海康官方demo中修改添加QImage...
  • 一个多线程的模拟相机程序,涉及到线程的建立,图片的加载和显示,定时器的调用 lowCameraThread.h文件 #ifndef LOWCAMERATHREAD_H #define LOWCAMERATHREAD_H #include <QWidget> #include <QThread> #...

空空如也

空空如也

1 2
收藏数 39
精华内容 15
关键字:

qimage相机