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

FFire 2015-01-28 12:38:50
求助,请问vc6如何判断图片中一条直线是在图片中间偏上还是偏下的位置?

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

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

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

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

恳请各位大神指点迷津,万分感谢!
...全文
444 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
FFire 2015-01-29
  • 打赏
  • 举报
回复
引用 20 楼 gz_qmc 的回复:
我猜想有的2货会钻牛角说 万一图片背景是多种颜色呢? 我告诉你,如果有背景有和线一样的颜色 那就不是一条线,是多条线 哥还就直接用鼠标在需要标识的线两头点一下 算都不用算,坐标就有了 咋的,你咬我呀?
好任性的说 谢谢大神了
FFire 2015-01-29
  • 打赏
  • 举报
回复
十分感谢各位的大力帮助,基本都消化了,但是目前看来最棘手的问题是如何从图像中提取直线并且把它处理成只有1根直线的状态了,这涉及到图像识别技术了吧,有朋友给出了方向,霍夫变换什么的,但是小弟才疏学浅,网上搜索半天抓不到头绪没有进展,如果有哪位有这方面的例程或者教程请不吝赐教,再次感谢! 目前刚开始接触opencv……
FFire 2015-01-28
  • 打赏
  • 举报
回复
引用 11 楼 finini 的回复:
也就是说你已经做到二值化了,没必要非要用这个函数啊。白底黑线的判断,自己写个简单算法就能实现判断啊。
没有做到二值化。。。我都是说的理想状态。。。分开考虑的。。。你说的二值化也就是我所谓的第一个函数“图像识别处理成线条那块是一个函数BOOL ImgToLine(CString strImgPath);” 第二个函数应该就是理想状态的白底黑线的判断现在看来确实很简单,看来楼上批评的对啊。。。。。。目前看来难点是图像分析出线条然后处理二值化这块啊,我不会+_+
FFire 2015-01-28
  • 打赏
  • 举报
回复
引用 12 楼 wangyaninglm 的回复:
我想最简单的两个模版相减,上半部分返回true下半部分返回false都行
谢谢! 目前看来难点是从复杂图像里分析出一条线,然后再二值化图像处理这块,我还不会。
FFire 2015-01-28
  • 打赏
  • 举报
回复
引用 9 楼 CharlesSimonyi 的回复:
首先熟悉GDI或GDI+的使用,学会把图片加载以后打开像素数组,即数组里面是整个图片每一个像素点的使用。 GDI里面用的是GetBitmapBits(),GDI+里面用的是Bitmap.LockBits()。得到像素数组后,之后的数字图像分析处理都在该数组进行。 首先图片的长和宽也是可以用GDI或GDI+获取的,知道长和宽后,在像素数组里逐行判断像素点的颜色,如果某一行全是黑色或者黑色像素点的数量超过一个值(如超过95%)则认为黑线在这一行,然后判断这一行所在的行数是在图片高度的上一半内还是下一半内。就OK了
万分感谢!!! 有点明白了,但是这个线条可能不是完全水平直线,所以我刚想到可以让上半部分黑色点数量和下半部分进行比较就可以了。相等就是在中间。。。 另外楼下说到了,二值化。。。这个其实我还不会呢,这个更难一点吧?
shiter 2015-01-28
  • 打赏
  • 举报
回复
我想最简单的两个模版相减,上半部分返回true下半部分返回false都行
finini 2015-01-28
  • 打赏
  • 举报
回复
也就是说你已经做到二值化了,没必要非要用这个函数啊。白底黑线的判断,自己写个简单算法就能实现判断啊。
encoderlee 2015-01-28
  • 打赏
  • 举报
回复
首先熟悉GDI或GDI+的使用,学会把图片加载以后打开像素数组,即数组里面是整个图片每一个像素点的颜色。 GDI里面用的是GetBitmapBits(),GDI+里面用的是Bitmap.LockBits()。得到像素数组后,之后的数字图像分析处理都在该数组进行。 首先图片的长和宽也是可以用GDI或GDI+获取的,知道长和宽后,在像素数组里逐行判断像素点的颜色,如果某一行全是黑色或者黑色像素点的数量超过一个值(如超过95%)则认为黑线在这一行,然后判断这一行所在的行数是在图片高度的上一半内还是下一半内。就OK了
encoderlee 2015-01-28
  • 打赏
  • 举报
回复
首先熟悉GDI或GDI+的使用,学会把图片加载以后打开像素数组,即数组里面是整个图片每一个像素点的使用。 GDI里面用的是GetBitmapBits(),GDI+里面用的是Bitmap.LockBits()。得到像素数组后,之后的数字图像分析处理都在该数组进行。 首先图片的长和宽也是可以用GDI或GDI+获取的,知道长和宽后,在像素数组里逐行判断像素点的颜色,如果某一行全是黑色或者黑色像素点的数量超过一个值(如超过95%)则认为黑线在这一行,然后判断这一行所在的行数是在图片高度的上一半内还是下一半内。就OK了
FFire 2015-01-28
  • 打赏
  • 举报
回复
引用 6 楼 finini 的回复:
楼主的思路有问题啊,你要识别电线,应该排除其他干扰才对,你还增加那么多线,这不是噪声么?人家降噪你增噪~
谢谢回复,图像识别这块我感觉更难,现在也不知道该怎么做好,目前先假设最好的状况就是白底加一条黑线的图片如何判断,也就是先实现int CheckState(CString strImgPath);函数就行
FFire 2015-01-28
  • 打赏
  • 举报
回复
引用 2 楼 finini 的回复:
楼上的哥们儿够辣!但是话糙理不糙,这个问题说难听点,不用高等数学知识,初中水平就可以了。。。
我确实学艺不精,现在又着急想实现这个功能,所以才来求教,能否指点一二。 我要实现的功能是: 现在有一幅照片,照片上有一根电线,我通过某种处理将照片转换成只有线条,也就是将那根电线识别出来,然后对只有线条的图片进行判断,得出结果该电线是靠近图片上方还是图片下方还是居中以便进一步处理,请问vc6编程实现这个功能的具体思路是怎样的?有没有类似的程序例程? 图像识别处理成线条那块是一个函数 BOOL ImgToLine(CString strImgPath); 判断位置这里是一个函数,参数都是图像文件路径, 返回值: 为0说明线条在图片正中, 正值偏上的偏移量, 负值偏下的偏移量 int CheckState(CString strImgPath);
finini 2015-01-28
  • 打赏
  • 举报
回复
楼主的思路有问题啊,你要识别电线,应该排除其他干扰才对,你还增加那么多线,这不是噪声么?人家降噪你增噪~
FFire 2015-01-28
  • 打赏
  • 举报
回复
引用 1 楼 gz_qmc 的回复:
兄弟,不懂数学呢,就好好学完高等数学再来 一个烂高中水平都不到的数学 你学什么图形编程 当真以为你是神的儿子吗?
我确实学艺不精,现在又着急想实现这个功能,所以才来求教,能否指点一二。 我要实现的功能是: 现在有一幅照片,照片上有一根电线,我通过某种处理将照片转换成只有线条,也就是将那根电线识别出来,然后对只有线条的图片进行判断,得出结果该电线是靠近图片上方还是图片下方还是居中以便进一步处理,请问vc6编程实现这个功能的具体思路是怎样的?有没有类似的程序例程? 图像识别处理成线条那块是一个函数 BOOL ImgToLine(CString strImgPath); 判断位置这里是一个函数,参数都是图像文件路径, 返回值: 为0说明线条在图片正中, 正值偏上的偏移量, 负值偏下的偏移量 int CheckState(CString strImgPath);
FFire 2015-01-28
  • 打赏
  • 举报
回复
引用 3 楼 bigtree_mfc 的回复:
首先你要获取图片的所有RGB数据 因为你要判断是直线是一条直线,所以肯定是图片中一段连续的相同RGB值数据, for循环判断是否有100或者多少相同RGB数据啦, 然后你就该知道怎么做了
谢谢! 我要实现的功能是: 现在有一幅照片,照片上有一根电线,我通过某种处理将照片转换成只有线条,也就是将那根电线识别出来,然后对只有线条的图片进行判断,得出结果该电线是靠近图片上方还是图片下方还是居中以便进一步处理,请问vc6编程实现这个功能的具体思路是怎样的?有没有类似的程序例程?
大树学长 2015-01-28
  • 打赏
  • 举报
回复
首先你要获取图片的所有RGB数据 因为你要判断是直线是一条直线,所以肯定是图片中一段连续的相同RGB值数据, for循环判断是否有100或者多少相同RGB数据啦, 然后你就该知道怎么做了
finini 2015-01-28
  • 打赏
  • 举报
回复
楼上的哥们儿够辣!但是话糙理不糙,这个问题说难听点,不用高等数学知识,初中水平就可以了。。。
ssbqrm 2015-01-28
  • 打赏
  • 举报
回复
如果直线是图中最长的,可以用OpenCV的HoughLineP函数提取直线(知道线段的起点和终点),找出最长的,然后判断在图中的位置
gz_qmc 2015-01-28
  • 打赏
  • 举报
回复
我猜想有的2货会钻牛角说 万一图片背景是多种颜色呢? 我告诉你,如果有背景有和线一样的颜色 那就不是一条线,是多条线 哥还就直接用鼠标在需要标识的线两头点一下 算都不用算,坐标就有了 咋的,你咬我呀?
gz_qmc 2015-01-28
  • 打赏
  • 举报
回复
任何一个弄不明白两点确定一条直线的 可以去死了 看懂了醍壶灌顶的, 可以跪安了 依然糊涂的 赶紧改行吧
gz_qmc 2015-01-28
  • 打赏
  • 举报
回复
有一点说明 不管你的线是怎么样的 只要你认定是直线 中间就不要管了 只扫描到头和尾就可以了, 这叫抓主要矛盾 从图片的左上角和右下角分别开始扫 不论你的线怎么歪 最先碰到的一定是头和尾的两个点 你还可以更快 设置两个标志 ,一次扫完 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; }
加载更多回复(3)

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧