精华内容
下载资源
问答
  • MFC+opencv 显示mat图像

    2018-05-10 15:49:52
    VS2015+opencv3.0 MFC显示图片中方法三在使用时,只能显示彩色图像,灰度图像显示有问题,经查找,是没有设置图像调色板的原因图片控件宽度不为4的倍数 显示错误, 修改代码/**************************************...

    VS2015+opencv3.0 MFC显示图片中方法三在使用时,

    • 只能显示彩色图像,灰度图像显示有问题,经查找,是没有设置图像调色板的原因
    • 图片控件宽度不为4的倍数 显示错误, 修改

    代码

    /*****************************************************
    *
    * 函数名称: void DrawcvMat(cv::Mat m_cvImg, UINT ID)
    * 函数功能: 在picture control中显示图像,设置Freame或者rectangle都可以
    *
    * ****************************************************/
    void CMFC_showImageDemoDlg::DrawcvMat(cv::Mat m_cvImg, UINT ID)
    { 
        cv::Mat img; 
        CRect rect; 
    
        GetDlgItem(ID)->GetClientRect(&rect);
        if (rect.Width()%4 != 0)
        {
            rect.SetRect(rect.left, rect.top, rect.left + (rect.Width() + 3) / 4 * 4, rect.bottom);  //调整图像宽度为4的倍数
            GetDlgItem(ID)->SetWindowPos(NULL, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOMOVE);
        }
    
        cv::Rect dst(rect.left, rect.top, rect.right, rect.bottom); 
        cv::resize(m_cvImg, img, cv::Size(rect.Width(), rect.Height()));  //使图像适应控件大小 
    
        unsigned int m_buffer[sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256];  
        BITMAPINFO* m_bmi = (BITMAPINFO*) m_buffer; 
        BITMAPINFOHEADER* m_bmih = &(m_bmi->bmiHeader); 
        memset(m_bmih, 0, sizeof(*m_bmih)); 
        m_bmih->biSize = sizeof(BITMAPINFOHEADER); 
        m_bmih->biWidth = img.cols;   //必须为4的倍数
        m_bmih->biHeight = -img.rows; //在自下而上的位图中 高度为负
        m_bmih->biPlanes = 1; 
        m_bmih->biCompression = BI_RGB; 
        m_bmih->biBitCount = 8 * img.channels(); 
    
        if (img.channels() == 1)  //当图像为灰度图像时需要设置调色板颜色
        {
            for (int i = 0; i < 256; i++)
            {
                m_bmi->bmiColors[i].rgbBlue = i;
                m_bmi->bmiColors[i].rgbGreen = i;
                m_bmi->bmiColors[i].rgbRed = i;
                m_bmi->bmiColors[i].rgbReserved = 0;
            }
        }
    
        CDC *pDC = GetDlgItem(ID)->GetDC(); 
        ::StretchDIBits( pDC->GetSafeHdc(), 0, 0, rect.Width(), rect.Height(), 0, 0, rect.Width(), rect.Height(), img.data, (BITMAPINFO*) m_bmi, DIB_RGB_COLORS, SRCCOPY ); 
        ReleaseDC(pDC); 
    }

    来张效果图 (虽然lenna是经典,但我还是更喜欢胖迪^-^)

    这里写图片描述

    展开全文
  • 此问题是由于opencv库中cxcore中一处行模板大小内存固定长度为4096限定造成的。...boolBmpDecoder::readData( Mat& img ) { … AutoBuffer _src, _bgr;//问题源处,此处大小为4096 … uchar *src = _src,

    此问题是由于opencv库中cxcore中一处行模板大小内存固定长度为4096限定造成的。

    通过代码跟踪发现:

    1 在bmp解码器中定位到问题(在grfmt_bmp.cpp文件中)

    boolBmpDecoder::readData( Mat& img )

    {

    AutoBuffer<uchar> _src, _bgr;//问题源处,此处大小为4096

    uchar *src = _src, *bgr = _bgr;

    /************************* 24 BPP ************************/

    case24:

    for( y = 0; y < m_height; y++, data += step )

    {

    m_strm.getBytes( src, src_pitch ) ;

    //问题代码所在此处只要24位bmp图超过宽度4096就会内存溢出

    if(!color)

    icvCvt_BGR2Gray_8u_C3C1R( src, 0, data, 0, cvSize(m_width,1) );

    else

    memcpy( data, src, m_width*3 );

    }

    result = true;

    break;

    }

    2 分析AutoBuffer模板定义(在cxcore.hpp文件中)

    template<typename_Tp, size_t fixed_size=4096/sizeof(_Tp)+8> classCV_EXPORTS AutoBuffer

    {

    …..

    protected:

    _Tp* ptr;

    size_t size;

    _Tp buf[fixed_size];

    }

    3初步解决方法

    1)在声明处将

    template<typename_Tp, size_t fixed_size=4096/sizeof(_Tp)+8> classCV_EXPORTS AutoBuffer

    将大小改为自己需要的大小:

    template<typename_Tp, size_t fixed_size=(5120 * 3)/sizeof(_Tp)+8> classCV_EXPORTS AutoBuffer

    2)或者在调用处将

    AutoBuffer<uchar,> _src, _bgr;

    替换为:

    AutoBuffer<uchar, (5120 * 3)/sizeof(uchar)+8> _src, _bgr;

    展开全文
  • //整理创建Mat的方法 //1. 使用Mat()构造函数构建 /** @overload @param rows Number of rows in a 2D array. 二维数组的行数,又图像的高度 ... 二维数组的列数,又图像宽度 @param type Array type. Use ...
    //整理创建Mat的方法
    	//1. 使用Mat()构造函数构建
    	/** @overload
    	@param rows Number of rows in a 2D array.    二维数组的行数,又图像的高度
    	@param cols Number of columns in a 2D array. 二维数组的列数,又图像的宽度
    	@param type Array type. Use CV_8UC1, ..., CV_64FC4 to create 1-4 channel matrices, or
    	CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices. 数组的类型,又图片的类型
    	*/
    	//Mat(int rows, int cols, int type);
    	Mat m(120, 120, CV_8UC3); //创建120×120的三通道图像,图像的像素值随机生成
    	randu(m, Scalar::all(0), Scalar::all(255));//也可以自己指定随机值的期望范围
    	Mat m2(120, 120, CV_8UC3, Scalar(0, 255, 0));//创建120×120的三通道图像,指定图像的像素值
    
    	//2. 采用Matlab式初始化
    	Mat eyeImg = Mat::eye(4, 4, CV_8UC3);//创建对角线为1,其余为0的图像
    	Mat oneImg = Mat::ones(4, 4, CV_8UC3);//创建像素值全为1的图像
    	Mat zeroImg = Mat::zeros(4, 4, CV_8UC3);//创建像素值全为0的图像
    
    	//3. 从已有的图像处拷贝
    	Mat cloneImg = eyeImg.clone();
    	Mat copyImg;
    	eyeImg.copyTo(copyImg);

     

    展开全文
  • 如何将unsigned char*(或BYTE*)图像数据封装成OpenCV中Mat类型环境:vs2008 + opencv2.4.6根据待封装图像数据的...第一种情况:图像宽度满足4的倍数,即满足BMP格式宽度要求。1.程序RdWtImrdWtIm;intwidth=0;intheig...

    如何将unsigned char*(或BYTE*)图像数据封装成OpenCV中Mat类型

    环境:vs2008 + opencv2.4.6

    根据待封装图像数据的宽度,封装方法有两种。

    下面以封装单通道、8位灰度BMP图像为例进行说明,其中读BMP图像程序是自己开发的。

    第一种情况:图像宽度满足4的倍数,即满足BMP格式宽度要求。

    1.程序

    RdWtIm rdWtIm;

    int width = 0;

    int height = 0;

    int lineByte = 0;

    BYTE* imData = rdWtIm.Read8bitbmp("lena.bmp", &width, &height);

    lineByte = (width + 3)/4*4; //格式宽度

    printf("width = %d\n", width);

    printf("height = %d\n", height);

    printf("lineByte = %d\n", lineByte);

    Mat iMat(height, width, CV_8UC1, imData, lineByte);

    namedWindow("lena");

    imshow("lena", iMat);

    其中,imData的尺寸是width*height,因我的Read8bitbmp读取的是有效数据;此时,width == lineByte.

    2.

    第二种情况:图像宽度不满足BMP格式宽度时

    1.程序

    RdWtIm rdWtIm;

    int width = 0;

    int height = 0;

    int lineByte = 0;

    BYTE* imData = rdWtIm.Read8bitbmp("lena.bmp", &width, &height);

    lineByte = (width + 3)/4*4; //格式宽度

    printf("width = %d\n", width);

    printf("height = %d\n", height);

    printf("lineByte = %d\n", lineByte);

    Mat iMat(height, width, CV_8UC1, imData, width);

    namedWindow("lena");

    imshow("lena", iMat);其中,imData的尺寸是width*height,因我的Read8bitbmp读取的是有效数据;此时,width

    2.结果

    注意:

    1.上述程序只是为了验证如何将相机传输来的内存数据封装成Mat,以便利用opencv来进行图像处理或计算机视觉开发;

    2.如果数据已经保存为图像文件,完全可以使用opencv自带的读图像函数imread。

    3.如果利用c/c++自己开发读bmp图像,可以考虑返回的即是格式宽度的图像数据,这样封装的时候一直使用lineByte就可以。

    4.可以参考我读写BMP图像程序。

    展开全文
  • 1. 二值图中,由白到黑 像素值由 255--0... 第一:Mat图有行和列,即cv::Mat中有公有成员变量cols和rows,注意,这里的cols就是图像宽度width,rows就是图像的高度height。这个width和height我们可以在其它Open...
  • Opencv Mat转Bitmap 图像出现错位显示

    千次阅读 2019-09-06 09:28:23
    图片明显错位显示,之后查找了很多资料,终于找到原因,bitmap数据格式中 图片宽度不是4的倍数导致,具体看一下链接 位图文件 https://blog.csdn.net/xiajun07061225/article/details/5813726 位图 最重要的是...
  • 如何将unsigned char*(或BYTE*)图像数据封装成OpenCV中Mat类型 环境:vs2008 + opencv2.4.6 根据待封装图像数据的...第一种情况:图像宽度满足4的倍数,即满足BMP格式宽度要求。 RdWtIm rdWtIm; int wid
  • 基于边缘宽度图像清晰度检测

    千次阅读 2018-01-03 15:06:13
    论文:《基于强边缘宽度直方图的图像清晰度指标.pdf》 实现: #include #include #define mydebug #define test using namespace cv; namespace ImageUtil { float getImageQuality_patchbased(cv::Mat& m...
  • 最近包装了下C++的人脸识别库以供C#程序调用, 遇到了C#与C库中的图像数据传递的问题...* @Param aWidth: 图像宽度 * @Param aHeight: 图像高度 * @Param aChannel: 图像通道数 灰度图为1, RGB为3 ARGB为4 * @Param a...
  • rows 是行数 , 即图像的高度cols 是列数 , 即图像宽度这一点要注意,弄反的话会出错当出现错误找不出的时候,不要忘记还有Exception可用try{出错代码}catch(Exception e){const char *errStr = e.waht();...
  • OpenCV的C++类Mat读取的图像在MFC中如何显示目前网络上资料较少,大部分的博文作者都在使用C API。界面上毕竟用C还是没有C++方便,尤其是像我这样的菜鸟。。。。,几经周折,我终于把图片显示在了MFC的视图上,正...
  • 使用cvPyrDown()创建一副宽度和高度为输入图像一半尺寸的图像 缩放处理函数:函数cvPyrDown使用Gaussian金字塔分解对输入图像向下采样。 cvPyrDown--------------为openCV中的一个函数。  功能:函数cvPyrDown...
  • opencv Mat类基础知识

    2018-12-12 21:46:32
    cols,rows 矩阵的行数,列数【注意,在图像中行数对应的是高度,列数对应的是宽度】,当维数大于2时,均为-1; dims 矩阵的维数; uchar* data; 存储具体数据的地址指针。       Mat 类创建: 常用的构造...
  • cv::Mat

    2017-07-30 20:17:11
    Mat定义:Mat (int rows, int cols, int type, void *data, size_t step=AUTO_STEP)第一个参数是图像行数,也就是高度。 第二个参数是图像列数,也就是宽度。 第三个参数是矩阵中元素的类型以及矩阵的通道个数,为...
  • OpenCV学习4-Mat对象

    2018-12-23 21:09:01
    2.Mat对象中保存了一副图像中的所有数据,包括像素数据,长度,宽度,深度等。 3.数字图像存储时,我们存储的是图像每个像素点的数值,对应的是一个数字矩阵。 4.Mat类由两部分数据组成:矩阵头(包含矩阵尺寸、...
  • 其中头部有图像宽度、高度和通道等,数据不有data等。 (2)、IplImage是从2001年OpenCV发布之后就一直存在,是C语言风格的数据结构,需要开发者自己分配与管理内存,对大的程序使用它容易导致内...
  • mat:成员变量,存放mat图像 widthPicCtrl:图像控件的宽度 width:mat图的宽 leftTop:图像控件的左上角坐标 heightPicCtrl:图像控件的长度 height:mat图的高 //获取鼠标点击处的像素值 void ...
  • Opencv系列(二):Mat类及其操作 一、数字图像 什么是数字图像?...(1)图像大小:图像的长(length)和宽(width),即图像在长度和宽度方向上的像素个数; (2)图像通道数:可以理解位表征一个像素...
  • Mat对象通道操作 图像通道分离 实现代码如下 split(Mat m,List<Mat> mv)//通道分离 ...//首先获取图像的通道数 宽度 和 高度 int channels = m1.channels(); if(channels>1){ List<Mat&...
  • 使用Mat类型存储图像,我的一些笔记。 cv::Mat是个模板,里面保存的数据类型是单个元素或者vector。 Mat(rows, cols, type); rows:高度 cols:宽度 type参数含义如下: //There are tons of matrix type ...
  • Matlab读取高光谱遥感数据.Mat 和 .tif(2020.12.27)

    千次阅读 热门讨论 2020-12-27 11:24:28
    Matlab查看高光谱遥感数据高...fprintf('输入图像宽度为 %d\n',b(1)); fprintf('输入图像高度为 %d\n',b(2)); fprintf('输入图像高度为 %d\n',b(3)); i=50;j=100;k=200; InputImg_r= InputImg(:,:,i);%获取第i个波段 I
  • 图像旋转任意角度

    千次阅读 2016-11-13 10:27:41
    void Roade(Mat &src, double angle)//...//输出图像宽度或高度 //为了保证无论如何旋转都能放下,输出图像的长和宽都设为输入图像对角线长度乘以SCALE //但如果是缩小(SCALE),这样会导致临时图像中放不下原图,所
  • 因为经常习惯的用OpenCV来做图像处理,...前面说了,定义好一个matrix或者array2d的变量后,是可以通过nr()和nc()函数来获取图像的高度和宽度(行数和列数),然后我们可以通过image_data()来获取数据指针,这个时候要...
  • Mat中的step[i], step1(i), elemsize, elemsize1在读取...step是一个数组,用 step 数据属性可得到单位是字节的图像的有效宽度,即使图像的类型不是 uchar,step 仍然能提供行的字节数,step 仍然能提供行的字节数。.
  • c++向python传输图片 高效方法 mat转numpy

    千次阅读 热门讨论 2018-08-30 08:55:30
    c++向python传输图片 效率最好的自然是传到python的...如果是多通道情况,最常见的就是红绿蓝(RGB)三通道,则第一个维度是高度,第二个维度是宽度,第三个维度是通道数 在代码中表达方式如下 import numpy as n...
  • % Y = MAT2HUFF(X) Huffman使用符号概率在单位宽度的直方图bins上编码了 %矩阵X ,范围在X 的最大值和最小值之间。被编码的数据作为结构体Y 被 %返回: %Y.code X被Huffman编码的值,存储在一个uint16的向量里。Y...

空空如也

空空如也

1 2 3 4 5
收藏数 89
精华内容 35
关键字:

mat图像宽度