Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
算法问题,如何在python和opencv中找到角度代码边界的像素数_Python_Opencv_Angle - Fatal编程技术网

算法问题,如何在python和opencv中找到角度代码边界的像素数

算法问题,如何在python和opencv中找到角度代码边界的像素数,python,opencv,angle,Python,Opencv,Angle,一个新手在这里,我正在研究python/opencv关于空间关系的问题,我需要从p点找到范围(0,alpha)内的白色像素数,你知道怎么做吗,或者有什么工具。 这里有两幅图片很好地描述了我的问题 我看到的原始二值图像 从给定的点p开始,我需要计算角度创建的形状内有多少白色像素 如果有我可以实现的算法解决方案或任何opencv函数,请告诉我。Lol,@Fiver在我完成示例编码之前就找到了它。好吧,我是这么做的 我创建了一组三个点(原始点、远离右侧的点和与给定角度匹配的旋转点) 我用这三点画了

一个新手在这里,我正在研究python/opencv关于空间关系的问题,我需要从p点找到范围(0,alpha)内的白色像素数,你知道怎么做吗,或者有什么工具。
这里有两幅图片很好地描述了我的问题
我看到的原始二值图像

从给定的点p开始,我需要计算角度创建的形状内有多少白色像素


如果有我可以实现的算法解决方案或任何opencv函数,请告诉我。

Lol,@Fiver在我完成示例编码之前就找到了它。好吧,我是这么做的

我创建了一组三个点(原始点、远离右侧的点和与给定角度匹配的旋转点)

我用这三点画了两条线。我使用copyMakeBorder在图像外部创建一个方形边缘,用我画的线创建一个闭合形状。然后我使用findContours,我知道我将得到三个轮廓(除了当角度=0时,但我们忽略它)

第一个轮廓将是整个矩形,因为我选择了树层次结构(它是父级)。在这两个孩子的轮廓中,我把他们分为大的和小的,然后根据给定的角度选择我想要制作面具的那一个

标记图像

只是面具

注:当角度==0或abs(角度)==180时,此方法将失败。当角度=0时,只有两个轮廓,因此代码将崩溃。当abs(angle)=180时,它将任意选择一个轮廓

导入cv2
输入数学
将numpy作为np导入
#将列表转换为整数元组
def tup(点):
返回(int(点[0]),int(点[1]);
#翻译一个观点
def translate2D(点、目标、符号):
点[0]+=目标[0]*符号;
点[1]+=目标[1]*符号;
#旋转一个点
def旋转2d(点,度):
#打开
x、 y=点;
rads=数学弧度(度);
#触发
rcos=数学cos(rads);
rsin=数学sin(rads);
#轮换
点[0]=x*rcos-y*rsin;
点[1]=x*rsin+y*rcos;
#加载图像
img=cv2.imread(“blub.png”);
灰色=cv2.CVT颜色(img,cv2.COLOR_BGR2GRAY);
#点和角度
点=[100150];
角度=-60;#负数是逆时针的
#创建投影
xproj=[点[0]+img.shape[1],点[1]];
rot=xproj[:];
平移2d(旋转,点-1);
旋转2d(旋转、角度);
平移2d(旋转,点,1);
#创建副本并绘制线
掩码=np.零(img.shape[:2],np.uint8);
掩码=cv2.线(掩码,tup(点),tup(xproj),(255),1);
掩模=cv2.直线(掩模,tup(点),tup(rot),(255),1);
边界=1;
mask=cv2.copyMakeBorder(mask,border,border,border,border,cv2.border_常量,无,(255));
#轮廓(除非为0度,否则应始终为3度)
_,等高线,u=cv2.找到的轮廓(遮罩,cv2.RETR_树,cv2.CHAIN_近似简单);
印刷品(透镜(轮廓));
#比较两个孩子的轮廓
一,二=等高线[1:];
如果cv2.轮廓面积(一)>cv2.轮廓面积(二):
大=一;
小=两个;
其他:
大=两个;
小=一;
#检查我们应该画哪一张
如果abs(角度)>=180:
con=小;
其他:
con=大;
cv2.绘制轮廓(灰色,[con],-1,(0),-1);
掩模=cv2.inRange(灰色,100255);
#画图
img[mask==255]=(0,0200);
img=cv2.直线(img,tup(点),tup(xproj),(0255,0),1);
img=cv2.直线(img,tup(点),tup(rot),(0255,0),1);
#计数
打印(“白色像素:”+str(np.计数非零(掩码));
#展示
cv2.imshow(“面具”,面具);
cv2.imshow(“blub”,img);
cv2.waitKey(0);
编辑:

如果您想将其推广到两点+角度(不仅仅是沿x轴投影)的情况,我们可以使用相同的算法,但只需将x投影点替换为沿向量的投影点

导入cv2
输入数学
将numpy作为np导入
#沿p2的直线延伸p2
def扩展(p1、p2、项目长度):
#获取单位向量
dx=p2[0]-p1[0];
dy=p2[1]-p1[1];
dist=math.sqrt(dx*dx+dy*dy);
dx/=dist;
dy/=dist;
#计划
dx*=项目长度;
dy*=项目长度;
返回[dx,dy];
#将列表转换为整数元组
def tup(点):
返回(int(点[0]),int(点[1]);
#翻译一个观点
def translate2D(点、目标、符号):
点[0]+=目标[0]*符号;
点[1]+=目标[1]*符号;
#旋转一个点
def旋转2d(点,度):
#打开
x、 y=点;
rads=数学弧度(度);
#触发
rcos=数学cos(rads);
rsin=数学sin(rads);
#轮换
点[0]=x*rcos-y*rsin;
点[1]=x*rsin+y*rcos;
#加载图像
img=cv2.imread(“blub.png”);
灰色=cv2.CVT颜色(img,cv2.COLOR_BGR2GRAY);
#获得图像分辨率
h、 w=惯性形状[:2];
#点和角度
点=[100150];
角度=-60;#负数是逆时针的
#第二点
p2=[150,90];
#创建投影
#xproj=[点[0]+img.shape[1],点[1]];
投影=延伸(点,p2,h*w);
rot=投影[:];
平移2d(旋转,点-1);
旋转2d(旋转、角度);
平移2d(旋转,点,1);
#创建副本并绘制线
掩码=np.零(img.shape[:2],np.uint8);
掩模=cv2.直线(掩模,tup(点),tup(投影),(255),1);
掩模=cv2.直线(掩模,tup(点),tup(rot),(255),1);
边界=1;
mask=cv2.copyMakeBorder(mask,border,border,border,border,cv2.border_常量,无,(255));
#轮廓(除非为0度,否则应始终为3度)
_,等高线,u=cv2.找到的轮廓(遮罩,cv2.RETR_树,cv2.CHAIN_近似简单);
印刷品(透镜(轮廓));
#比较两个孩子的轮廓
一,二=等高线[1:];
如果cv2.轮廓面积(一)>cv2.轮廓面积(二):
大=一;
小=两个;
其他:
大=两个;
小=一;
#检查我们应该画哪一张
如果abs(角度)>=180:
con=小;
其他:
con=大;
cv2.绘制轮廓(灰色,[con],-1,(0),-1);
掩模=cv2.inRange(灰色,100255);
#画图
img[mask==255]=(0,0200);
cv2.线路(img、tup(点