当前位置: 代码迷 >> VC/MFC >> ,请教vc6怎么判断图片中一条直线是在图片中间偏上还是偏下的位置? 比如小弟我有一张白底的bmp图片,上面有一条水平的黑色直线,小弟我怎么判断这条直线是在整张图片
  详细解决方案

,请教vc6怎么判断图片中一条直线是在图片中间偏上还是偏下的位置? 比如小弟我有一张白底的bmp图片,上面有一条水平的黑色直线,小弟我怎么判断这条直线是在整张图片

热度:119   发布时间:2016-05-02 03:28:32.0
求助,请问vc6如何判断图片中一条直线是在图片中间偏上还是偏下的位置? 比如我有一张白底的bmp图片,上面有一条水平的黑色直线,我如何判断这条直线是在整张图片
求助,请问vc6如何判断图片中一条直线是在图片中间偏上还是偏下的位置?

比如我有一张白底的bmp图片,上面有一条水平的黑色直线,我如何判断这条直线是在整张图片的中间偏上还是偏下的位置呢?

更进一步假如这条直线不是水平的怎么办?

opencv里有类似能解决这种问题的样例程序吗?

如果不用opencv就是mfc能实现吗?

恳请各位大神指点迷津,万分感谢!

------解决思路----------------------
兄弟,不懂数学呢,就好好学完高等数学再来
一个烂高中水平都不到的数学
你学什么图形编程
当真以为你是神的儿子吗?
------解决思路----------------------
楼上的哥们儿够辣!但是话糙理不糙,这个问题说难听点,不用高等数学知识,初中水平就可以了。。。
------解决思路----------------------
首先你要获取图片的所有RGB数据
因为你要判断是直线是一条直线,所以肯定是图片中一段连续的相同RGB值数据,
for循环判断是否有100或者多少相同RGB数据啦,
然后你就该知道怎么做了

------解决思路----------------------
楼主的思路有问题啊,你要识别电线,应该排除其他干扰才对,你还增加那么多线,这不是噪声么?人家降噪你增噪~
------解决思路----------------------
首先熟悉GDI或GDI+的使用,学会把图片加载以后打开像素数组,即数组里面是整个图片每一个像素点的使用。
GDI里面用的是GetBitmapBits(),GDI+里面用的是Bitmap.LockBits()。得到像素数组后,之后的数字图像分析处理都在该数组进行。
首先图片的长和宽也是可以用GDI或GDI+获取的,知道长和宽后,在像素数组里逐行判断像素点的颜色,如果某一行全是黑色或者黑色像素点的数量超过一个值(如超过95%)则认为黑线在这一行,然后判断这一行所在的行数是在图片高度的上一半内还是下一半内。就OK了
------解决思路----------------------
首先熟悉GDI或GDI+的使用,学会把图片加载以后打开像素数组,即数组里面是整个图片每一个像素点的颜色
GDI里面用的是GetBitmapBits(),GDI+里面用的是Bitmap.LockBits()。得到像素数组后,之后的数字图像分析处理都在该数组进行。
首先图片的长和宽也是可以用GDI或GDI+获取的,知道长和宽后,在像素数组里逐行判断像素点的颜色,如果某一行全是黑色或者黑色像素点的数量超过一个值(如超过95%)则认为黑线在这一行,然后判断这一行所在的行数是在图片高度的上一半内还是下一半内。就OK了
------解决思路----------------------
也就是说你已经做到二值化了,没必要非要用这个函数啊。白底黑线的判断,自己写个简单算法就能实现判断啊。
------解决思路----------------------
我想最简单的两个模版相减,上半部分返回true下半部分返回false都行
------解决思路----------------------
看来楼主态度还算好
这样吧
我给你一个道理
你自己想过程

你的线只在图片范围内,那就是有头有尾,也就是说是线段
先段总是有两个点的坐标来确定的
int x1,y1;
int x2,y2;

比如HH高,WW宽的图片
for(int j=0;j<HH,j++)
{
        for(int i=0;i<WW;i++)
        {
              取得(i,j)点的颜色;
              if(取得的颜色是黑色)
              {
                    x1=i;
                    y1=j;
                    退出循环
              }
        }
}
for(int j=0;j<HH,j++)
{
        for(int i=0;i<WW;i++)
        {
              取得(WW-i,HH-j)点的颜色;
              if(取得的颜色是黑色)
              {
                    x2=WW-i;
                    y2=HH-j;
                    退出循环
              }
        }
}

一幅图片的坐标是
(0,0) 到(WW,HH)
一条直线段的坐标是
(x1,y1)到(x2,y2)

那么剩下的就是纯数学问题
取线的中点
abs(x2-x1)/2, abs(y2-y1)/2
取图片的中点
(ww/2,  HH/2)
你说偏那面就偏那面
------解决思路----------------------
从你描述的问题来看,二值化还是最容易的。建议你先做二值化,这方面的代码请自行度娘,大把~
后面的复杂了,要从一堆像素中识别出一根线(水平或有斜率,直线或曲线),也就是符合一定条件的连续像素点,可能要用到霍夫(hough)变换,我也没有现成的,但是可以百度相关知识和代码。希望能帮到你。
------解决思路----------------------
有一点说明
不管你的线是怎么样的
只要你认定是直线
中间就不要管了
只扫描到头和尾就可以了,
这叫抓主要矛盾

从图片的左上角和右下角分别开始扫
不论你的线怎么歪
最先碰到的一定是头和尾的两个点
你还可以更快

设置两个标志 ,一次扫完
BOOL  p1OK=FALSE;
BOOL  p2OK=FALSE;

for(int j=0;j<HH,j++)
{
       for(int i=0;i<WW;i++)
       {
             if(!p1OK)
              {
                    取得(i,j)点的颜色;
                    if(取得的颜色是黑色)
                    {
                          x1=i;
                          y1=j;
                          p1OK=TRUE;
                    }  
              }     
              if(!p2OK)
              {
                    取得(WW-i,HH-j)点的颜色;
                    if(取得的颜色是黑色)
                    {
                            x2=WW-i;
                            y2=HH-j;
                            p2OK=TRUE;
                    }
             }
      }
      if(p1OK&&p2OK) break;
}


------解决思路----------------------
任何一个弄不明白两点确定一条直线的
可以去死了

看懂了醍壶灌顶的,
可以跪安了

依然糊涂的
赶紧改行吧
------解决思路----------------------
我猜想有的2货会钻牛角说
万一图片背景是多种颜色呢?

我告诉你,如果有背景有和线一样的颜色
那就不是一条线,是多条线

哥还就直接用鼠标在需要标识的线两头点一下
算都不用算,坐标就有了
咋的,你咬我呀?
------解决思路----------------------
如果直线是图中最长的,可以用OpenCV的HoughLineP函数提取直线(知道线段的起点和终点),找出最长的,然后判断在图中的位置
  相关解决方案