问题:
我有一个三维点云,每个块的质心代表一个块.为简单起见,这个例子只是二维的.如图所示,我想根据参数包含感兴趣的块.在这种情况下块1,6,5,4.为了进一步处理它们,我需要通过使用alpha形状或凸包来找到它们周围最小的船体.我有每个质心的坐标,我知道块扩展,所以我可以通过以下方式轻松找到块的边缘点:
xdimension=5;
ydimension=5;
block1=[5 15 1];
block2=[5 10 0];
block3=[5 5 0];
block4=[10 5 1];
block5=[10 10 1];
block6=[10 15 1];
block7=[15 5 0];
block8=[15 10 0];
block9=[15 15 0];
blocks=[block1;block2;block3;block4;block5;block6;block7;block8;block9]
dimension=[xdimension/2 ydimension/2];
point1=[1 1].*dimension;
point2=[1 -1].*dimension;
point3=[-1 1].*dimension;
point4=[-1 -1].*dimension;
i=size(blocks,1);
point1=repmat(point1,i,1);
point2=repmat(point2,i,1);
point3=repmat(point3,i,1);
point4=repmat(point4,i,1);
edges1=[blocks(:,1:2)+point1, blocks(:,3)] ;
edges2=[blocks(:,1:2)+point2, blocks(:,3)];
edges3=[blocks(:,1:2)+point3, blocks(:,3)];
edges4=[blocks(:,1:2)+point4, blocks(:,3)];
edges=[edges1;edges2;edges3;edges4];
x=edges(edges(:,3)==1,1);
y=edges(edges(:,3)==1,2);
K=convhull(x,y)
scatter(edges(:,1), edges(:,2))
hold on
plot(x(K),y(K),'r-')
hold off
Run Code Online (Sandbox Code Playgroud)
这会产生类似于此处的图片.
题
如何查询第2和第3块凸包所包含的曲面(或我的实际问题中的体积)?我需要包含的每个单独块的精确表面/体积,除了我指定的那些(这里有二进制指示器).请注意,这是一个示例,我正在寻找如何独立于示例的想法.我真的很感激一些帮助,因为我主要陷入困境,我不知道如何解决它.
我想生成一个二进制掩码,其中包含内部所有体素的二进制掩码,以及体积外所有体素的零.体积由围绕一组3D坐标(<100;一些坐标在体积内)的凸包定义.
我可以使用CONVHULLN获取凸包,但是如何将其转换为二进制掩码?
如果没有通过凸包的好方法,你还有其他想法如何创建二进制掩码?
二维凸包的算法使用排序。假设有人给你一个库,其中凸包被实现为黑匣子。展示如何使用凸包算法对给定整数序列进行排序。“黑匣子”一词意味着您不查看代码内部;而是查看代码。你只知道输入和输出是什么以及结果是什么样的。您无法从凸包的库实现中“拉出排序算法”。您可以假设您可以将凸包算法作为原始步骤调用。
请帮我,
Android上的Convex Hull有问题.我使用Java和OpenCV 2.3.
在我使用Java之前,我使用Visual Studio 2008在C++上创建它.
此代码可以在C++上成功运行.
现在,我想在Android上将它从C++转换为Java.当我在SDK Android模拟器上运行它时,我发现了像"强制关闭"这样的错误.
这是我在C++上的代码:
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours( canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
drawing = Mat::zeros( canny_output.size(), CV_64F );
/// Find the convex hull object for each contour
vector<vector<Point> > hull ( contours.size() );
for( int i = 0; i < contours.size(); i++ )
{ convexHull( Mat(contours[i]), hull[i], false );
}
for(size_t i = 0; i < contours.size(); i++){
drawContours( drawing, hull, i, Scalar(255, 255, 255), …Run Code Online (Sandbox Code Playgroud) 有没有快速的方法来做到这一点?在线搜索显示函数或单个多边形的凸性.但我需要能够检查整个模型.物体可以具有凸面,但可以像圆环一样整体凹入.
我有一组平假名字符,我想计算字符的端点/提示数量。
示例:输入图像:
所需的输出图像:
我试过使用凸包
代码:(基于此处的opencv教程)
findContours(threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
vector<vector<Point> >hull(contours.size());
for (int i = 0; i < contours.size(); i++)
{
convexHull(Mat(contours[i]), hull[i], false);
}
Mat drawing = Mat::zeros(threshold_output.size(), CV_8UC3);
for (int i = 0; i< contours.size(); i++)
{
if (hierarchy[i][3] == 0) {
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
drawContours(drawing, hull, i, color, 1, 8, vector<Vec4i>(), 0, Point());
}
}
Run Code Online (Sandbox Code Playgroud)
然后 conrnerHarris() 但它返回了太多不需要的角落
代码:(基于此处的opencv教程)
int blockSize = 2;
int …Run Code Online (Sandbox Code Playgroud) 给定一组点,
points = np.random.randn(...) # n 3d points
Run Code Online (Sandbox Code Playgroud)
我想均匀地填充由凸包定义的体积,其中它们位于nx33d 点列表( np.array of shape )中。
我可以得到凸包
hull = scipy.spatial.ConvexHull(points)
Run Code Online (Sandbox Code Playgroud)
获得均匀填充该船体体积的点列表的最快方法是什么?
我在创建复杂的凸包时遇到问题。如果我更改为具有 10 个点左右的简单多边形,效果很好,但是当我在大面积上有 20-30 个点时,它会在多边形中创建“分割”。然而数学表明它应该寻找所有异常值,并将它们用作“船体点”。我想知道我的数学是否不正确,或者这是否是 JavaScript 的侥幸?
作为参考,这里是我收集数学和示例代码片段的网站:平面点集的凸包
这是我所能得到的最精简的,同时仍然作为一个独立的片段发挥作用。
var gmarkers = [];
var points = [];
var hullPoints = [];
var map = null;
var polyline;
var infowindow = new google.maps.InfoWindow(
{
size: new google.maps.Size(150, 50)
});
function initialize() {
var myOptions = {
zoom: 10,
center: new google.maps.LatLng( 41.024767, -74.122642),
mapTypeControl: true,
mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU},
navigationControl: true,
mapTypeId: google.maps.MapTypeId.ROADMAP
}
map = new google.maps.Map(document.getElementById("map_canvas"),
myOptions);
google.maps.event.addListener(map, 'click', function () {
infowindow.close();
});
google.maps.event.addListenerOnce(map, 'bounds_changed', function () { …Run Code Online (Sandbox Code Playgroud)我在2D中有一组点(x和y的坐标),现在我需要丢弃对我没有意义的所有点,我的意思是我只对这个点的区域感兴趣跟踪.
总之,这个

它应该产生这个

问题:在这一点上,哪种算法可以做这种过滤?
所以我试图从python中的轮廓绘制convexHull,但是当我打印图像时它没有改变.
roi=mask[y:y+h,x:x+w]
roi = cv2.fastNlMeansDenoisingColored(roi,None,15,15,7,21)
hull = cv2.convexHull(cnt)
cv2.drawContours(roi,[hull],0,(147,0,255),2)
cv2.imshow(str(i),roi)
blank_image[y:y+h,x:x+w] = roi
Run Code Online (Sandbox Code Playgroud)
convex-hull ×10
matlab ×2
opencv ×2
python ×2
3d ×1
algorithm ×1
android ×1
c++ ×1
game-engine ×1
geometry ×1
google-maps ×1
graphics ×1
image ×1
java ×1
javascript ×1
numpy ×1
ocr ×1
scipy ×1
sorting ×1