用DrawLine与cvLine在位图中绘制直线

  Graphics.DrawLine与CvInvoke.cvLine可以在位图中的指定位置绘制指定颜色的直线(C#) ,近期刚学会使用,记录一下学习过程中遇到的“挫折”,便于今后查阅。

1. Graphics.DrawLine

  Graphics.DrawLine在位图中绘制直线的代码示例如下:

  Graphics.DrawLine方法无法从带有索引像素格式的图像创建graphics对象。如果我将原始位图先执行二值化,将二值化数组转换为位图,若直接在二值化图像上创建graphics对象时,就会报错“无法从带有索引像素格式的图像创建graphics对象”,如下图所示。无论使用自行编写的二值化函数或是使用EMGU的CvInvoke.cvThreshold执行二值化,均会出现此错误。

  针对此错误,我在http://www.cnblogs.com/qixuejia/archive/2010/09/03/1817248.html找到了对策(感谢原作者),我们可以先判断原图片是否是索引像素格式的,如果是,则可以采用将此图片先clone到一张BMP上的方法来解决,代码如下:

2.CvInvoke.cvLine

   每次使用EMGU提供的相关函数,参数的给定方式都颇费周折,因此成功使用CvInvoke下的函数后均要将其参数写法记录下来,避免今后再被相同的问题困扰。

CvInvoke.cvLine可以直接对索引像素格式的图像进行处理,也就是说CvInvoke.cvLine可以在二值化后的图像上画线。

3. Graphics.DrawLine与CvInvoke.cvLine中坐标

   两个函数均需要指明直线的起点与终点,而这两个点的坐标与二值化图像数组的坐标风格不一致。假设Byte[,] Array为某个图像的二值化数组,定义该图像从左到右为一行,从上到下为一列,那么该图像的高度即为该数组的行数,而宽度为该数组的列数。那么Array[i,j]指的是图像上的第i行第j列的像素,但new Point(i,j)则指的是第i列第j行。 也就是所如果给出直线的两点为Point(10,30),Point(30,30),则结果为一条直线;若为Point(30,10),Point(30,30),则结果为一条竖线。

Comments

  1. By Molly

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Fork me on GitHub