有关图像和矩阵的访问

来源:互联网 发布:中国移动大数据平台 编辑:程序博客网 时间:2024/05/18 03:49

现已知道在8U型的图像中,如果相素等于0则表示该点是黑色的,如果等于255则表示是白色的;

在16F型的图像中(浮点),如果相素等于0则表示该点是黑色的,如果等于1则表示是白色的。

下面的三个小程序都是试图把图像的中间部位设置成白色的:

程序一:对于8U型的图像

#include"stdafx.h"

#include"cv.h"

#Include"highgui.h"

void main()

{

    IplImage* img=cvCreateImage(cvSize(500,500),IPL_DEPTH_8U,1);

    cvZero(img);

    uchar* data=(uchar*)img->ImageData;

   int i,j;

    for(i=50;i<350;i++)

      for(j=50;j<350;j++)

        data[i*img->widthStep+j]=255;

   cvNamedWindow("crystal",0);

   cvShowImage(crystal",img);

   cvWaitKey(0);

   cvReleaseImage(&img);

   cvDestroyWindow("crystal");

}

运行结果:得到一幅中间白,旁边黑的图像。(运行成功)

程序二:对于16F的矩阵

#include "stdafx.h"
#include"highgui.h"
#include"cv.h"
 
void main()
{
  CvMat* img=cvCreateMat(500,500,CV_32FC1);
  cvZero(img);
  int i,j;
  for(i=150;i<350;i++)
   for(j=150;j<350;j++)
     cvSetReal2D(img,i,j,1);
  cvNamedWindow("crystal",0);
  cvShowImage("crystal",img);
  cvWaitKey(0);
  cvReleaseMat(&img);
  cvDestroyWindow("crystal");
}

运行结果:同上。(运行成功)

程序三:对于16F的图像

#include"stdafx.h"
#include"cv.h"
#include"highgui.h"

void main()
{
  IplImage* img=cvCreateImage(cvSize(500,500),IPL_DEPTH_32F,1);
  cvZero(img);
  int i,j;
  for(i=150;i<350;i++)
  {
   float *ptr=(float*)(img->imageData+i*img->widthStep/4);
   for(j=150;j<350;j++)
    ptr[j*img->widthStep/4+i]=1;
  } 
  cvNamedWindow("crystal",0);
  cvShowImage("crystal",img);
  cvWaitKey(0);
  cvReleaseImage(&img);
  cvDestroyWindow("crystal");
}

运行结果:能运行出来,但不是预期的结果。(运行失败)

很奇怪的一个问题,有待以后再来研究!

原创粉丝点击