怎么在opencv里面用指针读取的灰度值怎么能将点的坐标也显示出来

怎么在opencv里面用指针读取的灰度值怎么能将点的坐标也显示出来,第1张

显示中每个像素点的灰度值 #include"cvh" #include"highguih" #include using namespace std; int main(int argc, char argv) { IplImage src = cvLoadImage( "0bmp", 0 );//导入 int width=src->width;//宽度

嗯 ~~是这样的,。

1:你知道每个像素的坐标和灰度,那就知道图像的大小,定义一个固定的二维数组,把所有像素存入其中。

color ColorBuffer[WIDTH][HEIGHT] = {0};

ColorBuffer[i][j]b = ColorBuffer[i][j]g = ColorBuffer[i][j]r = colorzhi1//当前像素值,如果RGB一样。如果不一样则单独赋值;

2: 然后SaveBmp((LPSTR)(LPCTSTR)bmpname, WIDTH,HEIGHT, (unsigned char)ColorBuffer);

把ColorBuffer中的值转化成BMP

//bmpnameFormat("E:\\8位图像%dbmp",1);

3:保存还是直接显示就看你自己了

参考SaveBmp函数: 这是vc9下的,UNC字符集的。

void CSeekerDataDlg::SaveBmp(char filename,int height,int width,unsigned char data)

// 函数名 文件名指针 文件高度 文件宽度 文件数据指针

{

unsigned int size = width height 3 + 54;

struct BMPPIC

{

BITMAPFILEHEADER bitmapfileheader;

BITMAPINFOHEADER bitmapinfoheader;

}bitmap;

//写bmp文件信息头

bitmapbitmapinfoheaderbiSize = sizeof(BITMAPINFOHEADER);

bitmapbitmapinfoheaderbiWidth = width;

bitmapbitmapinfoheaderbiHeight = height;

bitmapbitmapinfoheaderbiPlanes = 1;

bitmapbitmapinfoheaderbiBitCount = 24; //24位

bitmapbitmapinfoheaderbiCompression = 0;

bitmapbitmapinfoheaderbiSizeImage = widthwidth3;

bitmapbitmapinfoheaderbiXPelsPerMeter = 0;

bitmapbitmapinfoheaderbiYPelsPerMeter = 0;

bitmapbitmapinfoheaderbiClrUsed = 256;

bitmapbitmapinfoheaderbiClrImportant = 256;

//写文件头

bitmapbitmapfileheaderbfType = 0x4D42; // 位图文件的类型,必须为BM

bitmapbitmapfileheaderbfSize = (DWORD)sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+ heightwidth3; //位图文件的大小,以字节为单位

bitmapbitmapfileheaderbfReserved1 = 0; // 位图文件保留字,必须为0

bitmapbitmapfileheaderbfReserved2 = 0; // 位图文件保留字,必须为0

bitmapbitmapfileheaderbfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); // 位图数据的起始位置,以相对于位图 // 文件头的偏移量表示,以字节为单位

int totaldLine=height;

int totalArray=width;

int lpitch=bitmapbitmapinfoheaderbiSizeImage/bitmapbitmapinfoheaderbiHeight;

int ipitch=bitmapbitmapinfoheaderbiWidth(bitmapbitmapinfoheaderbiBitCount/8);

//bitmapbuffer=(UCHAR)malloc(bitmapbitmapinfoheaderbiSizeImage);

//HANDLE fh;

// fh = CreateFile(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);

FILE fp = fopen(filename, "wb");

if (!fp) return;

fwrite((LPSTR)&bitmapbitmapfileheader, 1, sizeof(bitmapbitmapfileheader), fp);

fwrite((LPSTR)&bitmapbitmapinfoheader, 1,sizeof(bitmapbitmapinfoheader),fp);

fwrite(data, 1, size,fp); fclose(fp);

}

格雷码是一种特殊的二进制码,在结构光三维视觉中,常常被用于编码。比起我们常见的二进制码,格雷码具有相邻数字的编码只有一位不同的优点,这个优点对于解码而言十分重要,可以减少光解码的错误率。下面我们可以看下如何对结构光用格雷码编码,并如何对编码的结构光进行解码。

以5位格雷码为例,5位格雷码可以对32个像素位置进行编码,由之前的文章可以知道,我们在计算结构光三维重建时,只需要对结构光的一个方向编码,以常见的列格雷码为例,如图所示是5位列格雷码编码集。

图中我们对每个像素点进行了格雷码编码,每一张都代表了格雷码的某一位,以第1列为例,其格雷码编码为00001,则前4张中第一列的的格雷码编码的条纹都是黑色,代表0,而最后一张第一列的格雷码编码是白色,代表1

格雷码的解码很简单,只要把投影的格雷码结构光再还原回十进制数字,我们就能知道相机中的像素点(uc,vc)对应的是投影的哪一列(up)了。想要得到一个好的三维重建结果,主要是对相机捕捉到的结构光进行准确的二值化 *** 作,使得相机中每个像素点都能够正确解码。

常见的二值化 *** 作有很多,最简单的是设一个全局灰度阈值,对灰度值高于阈值的像素点置1,对灰度值低于阈值的像素点置0。 或者利用局部自适应阈值对进行二值化 *** 作等·。常见的利用每个像素点周边灰度信息的二值化 *** 作,往往不能够满足格雷码结构光解码的二值化需求。因为使用结构光的环境往往是未知且复杂的。比如同样的结构光光强照在黑色物体表面的亮度比照射在白色物体表面的亮度要低。这意味着同样的光条纹在不同物体上获取的灰度值不同。由于不能提前预知环境中的物体表面信息,仅仅靠简单的利用像素点及其周周围灰度值的分布得出该像素点当前是来自结构光的亮条纹还是暗条纹是及其不准确的。

虽然由于环境光,以及物体表面材质的原因,一幅图像中像素的亮度(灰度值)通常是不均匀的,无法直接利用一张呈现的灰度信息对结构光解码,但是我们可以利用结构光系列来帮助获取像素点当前是亮条纹还是暗条纹的信息。以上图的格雷码编码为例,一个5位的格雷码编码需要投影5张结构光,假设有一个编码为 11011的格雷码条纹打在物体表面上,,在连续投影的5张格雷码中,物体表面被编码照射的位置既经历过暗条纹(编码为0)又经历过亮条纹(编码为1)。不过由于每张格雷码编码的光源编码不同,而且结构光光源在物体表面上形成的漫反射不同,当结构光编码不一样时,即使是同样经历亮条纹照射,该位置的亮度(灰度值)也是不同的。总的来说,对于同一个位置,可以近似认为其被亮条纹照射到的亮度总是高于其被暗条纹照射到的亮度。那么对于一个像素点在一张中的二值化可以用如下方法。

以上就是关于怎么在opencv里面用指针读取的灰度值怎么能将点的坐标也显示出来全部的内容,包括:怎么在opencv里面用指针读取的灰度值怎么能将点的坐标也显示出来、现已获得各个像素点的坐标和灰度值,如何用VC++绘制位图、如何根据灰度值得到当前像素点的格雷码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/10637506.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-10
下一篇2023-05-10

发表评论

登录后才能评论

评论列表(0条)

    保存