OpenCV笔记

来源:互联网 发布:sql2000数据库备份 编辑:程序博客网 时间:2024/05/30 04:29

语法

1. mfc下hbitmap与mat的转换
【参考链接】

BOOL IMGDlg::HBitmapToMat(HBITMAP& _hBmp,Mat& _mat){BITMAP bmp;    GetObject(_hBmp,sizeof(BITMAP),&bmp);    int nChannels = bmp.bmBitsPixel == 1 ? 1 : bmp.bmBitsPixel/8 ;   int depth = bmp.bmBitsPixel == 1 ? IPL_DEPTH_1U : IPL_DEPTH_8U;    Mat v_mat;v_mat.create(cvSize(bmp.bmWidth,bmp.bmHeight), CV_MAKETYPE(CV_8U,nChannels));GetBitmapBits(_hBmp,bmp.bmHeight*bmp.bmWidth*nChannels,v_mat.data);  _mat=v_mat;return TRUE;   }BOOL IMGDlg::MatToHBitmap(HBITMAP& _hBmp,Mat& _mat){//MAT类的TYPE=(nChannels-1+ CV_8U)<<3int nChannels=(_mat.type()>>3)-CV_8U+1;int iSize=_mat.cols*_mat.rows*nChannels;_hBmp=CreateBitmap( _mat.cols,_mat.rows,1,nChannels*8,_mat.data);return TRUE;}//注意此处CV_8U须使用实际的通道深度,本例因可以确定故写为CV_8U

2. FileStorage修改node的值
好像没有直接修改.yml中某一node值的方法【待确认】,可以复制一个临时文件,读入再写出yml,最后删除临时文件

FileStorage fs;fs["node1"] >> value;//可以//fs["node1"] << value;//这样直接写出不可以//fs << "node1" << vlaue;//可以

FileStorage打开后,没有release导致程序退出时崩溃!!注意及时关闭文件!!!

CImage
IPLImage
cvvImage

应用

图像Dither

分辨率,单位是dpi(dot per inch),即每英寸点数,点数越多,分辨率就越高,图象就越清晰。

例如:

  1. 设显示器为15英寸(指对角线长度),最多显示1280×1024个点。因为宽高比为4:3,所以宽有12英寸,高有9英寸,则该显示器的水平分辨率为106dpi,垂直分辨率为113.8dpi。

  2. 假设有一幅240×180×8bit的灰度图,当用分辨率为300dpi×300dpi的激光打印机将其打印到12.8×9.6英寸的纸上时,每个象素的图案有多大?这张纸最多可以打(300×12.8)×(300×9.6)=3840×2880个点,所以每个象素可以用(3840/240)×(2880/180)=16×16个点大小的图案来表示,即一个象素256个点。如果这16×16的方块中一个黑点也没有,就可以表示灰度256;有一个黑点,就表示灰度255;依次类推,当都是黑点时,表示灰度0。这样,16×16的方块可以表示257级灰度,比要求的8bit共256级灰度还多了一个。所以上面的那幅图的灰度级别完全能够打印出来。

抖动是以牺牲分辨率为代价,通过颜色值的抖动来增加可用颜色数量。抖动是引入了随机成分(???),从而避免图案法(patterning)选点和块划分过大的问题。

Floyd–Steinberg dithering抖动算法可参考wikipedia关于算法原理、OpenCV实现。

原创粉丝点击