求助,请问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函数提取直线(知道线段的起点和终点),找出最长的,然后判断在图中的位置