给定一个x,y点数组,如何按顺时针顺序(围绕它们的整体平均中心点)对该数组的点进行排序?我的目标是将点传递给线创建函数,以最终看起来相当"坚实"的东西,尽可能凸起,没有相交的线.
为了它的价值,我正在使用Lua,但任何伪代码都会受到赞赏.非常感谢您的帮助!
更新:作为参考,这是基于Ciamej优秀答案的Lua代码(忽略我的"app"前缀):
function appSortPointsClockwise(points)
local centerPoint = appGetCenterPointOfPoints(points)
app.pointsCenterPoint = centerPoint
table.sort(points, appGetIsLess)
return points
end
function appGetIsLess(a, b)
local center = app.pointsCenterPoint
if a.x >= 0 and b.x < 0 then return true
elseif a.x == 0 and b.x == 0 then return a.y > b.y
end
local det = (a.x - center.x) * (b.y - center.y) - (b.x - center.x) * (a.y - center.y)
if det < 0 then return true
elseif det > 0 then …Run Code Online (Sandbox Code Playgroud) 我正在尝试在即将推出的应用中实现裁剪和透视校正功能.在做研究的同时,我遇到了:
在一组cv :: Point上执行cv :: warpPerspective以进行伪偏移
http://sudokugrab.blogspot.ch/2009/07/how-does-it-all-work.html
所以我决定尝试用OpenCV实现这个功能 - 框架就在那里,所以安装很快.但是,我没有得到我希望的结果:(第二张图片是结果)


我已经翻译了所有代码以使用Xcode并三次检查坐标.你能告诉我我的代码有什么问题吗?为了完整起见,我还包括了UIImage - > Mat转换+反转:
- (void)confirmedImage
{
if ([_adjustRect frameEdited]) {
cv::Mat src = [self cvMatFromUIImage:_sourceImage];
// My original Coordinates
// 4-------3
// | |
// | |
// | |
// 1-------2
CGFloat scaleFactor = [_sourceImageView contentScale];
CGPoint p1 = [_adjustRect coordinatesForPoint:4 withScaleFactor:scaleFactor];
CGPoint p2 = [_adjustRect coordinatesForPoint:3 withScaleFactor:scaleFactor];
CGPoint p3 = [_adjustRect coordinatesForPoint:1 withScaleFactor:scaleFactor];
CGPoint p4 = [_adjustRect coordinatesForPoint:2 withScaleFactor:scaleFactor];
std::vector<cv::Point2f> c1;
c1.push_back(cv::Point2f(p1.x, p1.y));
c1.push_back(cv::Point2f(p2.x, p2.y));
c1.push_back(cv::Point2f(p3.x, p3.y)); …Run Code Online (Sandbox Code Playgroud) 阵列中的四个2D点.我需要按顺时针顺序对它们进行排序.我认为只需一次交换操作即可完成,但我无法正式解决这个问题.
编辑:在我的情况下,四个点是凸多边形.
编辑:四个点是凸多边形的顶点.他们不需要整理好.
我正在尝试使用OpenCV for iOS裁剪来自视频流的图像.我不是想做任何花哨的事情,只需裁剪图像,然后显示它.我试过这个,这个,似乎对我都不起作用.作为委托方法,我得到了传入的当前cv :: Mat图像,所以我需要的是创建裁剪效果的代码.
我可以做一些那样复杂此如果需要的话,但我只需要一个长方形的作物,所以我觉得还有一个更简单的方法.我只是不明白为什么设置ROI不适合我!
cv::Rect myROI(10, 10, 100, 100);
cv::Mat croppedImage = src(myROI);
src.copyTo(croppedImage);
[displayView setImage:[UIImage imageWithCVMat:src]];
Run Code Online (Sandbox Code Playgroud)
^^^不工作,只显示原始图像
附件1是来自名为GeniusScan的应用程序的屏幕截图,您可以在其中拍摄任何文档,并在imageview上显示可调整的矩形网格.您可以用手指轻松调整网格边框,以选择要扫描的图像部分.然后它将转变为正确的前景.
1-如何在imageview上绘制网格并与其交互?
2-如何将网格的角点返回到视图控制器.

更新:我发现了一个名为BJImageCropper的精彩类,它允许使用手指调整边框,但仅限于矩形框.任何人都可以建议如何更新它以支持像GeniusScan应用程序中的形状?
ios ×3
algorithm ×2
geometry ×2
objective-c ×2
opencv ×2
graphics ×1
lua ×1
math ×1
perspective ×1
sorting ×1