我正在做一个有趣的项目:使用OpenCV从输入图像中解决数独(如Google护目镜等).我完成了任务,但最后我发现了一个问题,我来到这里.
我使用OpenCV 2.3.1的Python API进行编程.
以下是我的所作所为:
找到角点.
例如,如下:

(请注意,绿线正确地与Sudoku的真实边界重合,因此可以正确扭曲数独.查看下一张图片)
将图像扭曲成完美的正方形
例如:

执行OCR(我使用我在OpenCV-Python中的简单数字识别OCR中给出的方法)
而且方法效果很好.
问题:
看看这个图像.
在此图像上执行第4步,结果如下:

绘制的红线是原始轮廓,它是数独边界的真实轮廓.
绘制的绿线是近似轮廓,它将是扭曲图像的轮廓.
当然,在数独的上边缘绿线和红线之间存在差异.因此,在翘曲时,我没有得到数独的原始边界.
我的问题 :
如何在数独的正确边界上扭曲图像,即红线,或者如何消除红线和绿线之间的差异?在OpenCV中有没有这方法?
我在我的测试应用程序中成功实现了OpenCV平方检测示例,但现在需要过滤输出,因为它非常混乱 - 或者我的代码是错误的?
我对本文的四个角点感兴趣,以减少偏斜(如此)和进一步处理......
原始图片:
码:
double angle( cv::Point pt1, cv::Point pt2, cv::Point pt0 ) {
double dx1 = pt1.x - pt0.x;
double dy1 = pt1.y - pt0.y;
double dx2 = pt2.x - pt0.x;
double dy2 = pt2.y - pt0.y;
return (dx1*dx2 + dy1*dy2)/sqrt((dx1*dx1 + dy1*dy1)*(dx2*dx2 + dy2*dy2) + 1e-10);
}
- (std::vector<std::vector<cv::Point> >)findSquaresInImage:(cv::Mat)_image
{
std::vector<std::vector<cv::Point> > squares;
cv::Mat pyr, timg, gray0(_image.size(), CV_8U), gray;
int thresh = 50, N = 11;
cv::pyrDown(_image, pyr, cv::Size(_image.cols/2, _image.rows/2));
cv::pyrUp(pyr, …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) 我有一个图像和一组四个点(描述四边形Q).我想转换这个图像,使其适合四边形Q.Photoshop称这种转换为"扭曲".但是根据这个四边形的来源(图像在空间中移动的视角),它实际上是尺度,旋转和透视矩阵的组合.
我想知道使用CATransform3D 4x4矩阵是否可行.你有任何关于如何做到这一点的提示吗?我试图取四个点并构建16个方程式(A'= A xu),但它不起作用:我不确定我应该使用什么作为z,z',w和w'系数......
下图显示了我想要做的事情:

以下是一些要点的例子:
276.523, 236.438, 517.656, 208.945, 275.984, 331.285, 502.23, 292.344
261.441, 235.059, 515.09, 211.5, 263.555, 327.066, 500.734, 295
229.031, 161.277, 427.125, 192.562, 229.16, 226, 416.48, 256
Run Code Online (Sandbox Code Playgroud) 下图将告诉你我想要什么.
我有图像中的矩形信息,宽度,高度,中心点和旋转度.现在,我想编写一个脚本来剪切它们并将它们保存为图像,但要理顺它们.因为我想从图像内部显示的矩形转到外面显示的矩形.
我正在使用OpenCV python,请告诉我一种方法来实现这一目标.
请显示一些代码作为OpenCV Python的例子很难找到.

我是openCV的新手,因此在过去的3到4天里一直在努力,我已经检测到纸张边界,现在我想在角落上绘制4个圆圈.
我从这段代码中画出边界
const cv::Point* p = &squares[i][0];
int n = (int)squares[i].size();
polylines(image, &p,&n, 1, true, Scalar(255,255,0), 5, CV_AA);
Run Code Online (Sandbox Code Playgroud)
我是openCV的新手,所以在我看来我有左上角点p-> x和p-> y,但是我如何得到其他角落,我也对这个折线方法中的参数&n感到困惑,这个折线方法怎么样绘制完整的矩形?
当我使用边界矩形时,它并不完美,它给纸张侧面留下了一点空间.
任何帮助都非常感谢
代码是:
- (cv::Mat)finshWork:(cv::Mat &)image
{
// read in the apple (change path to the file)
Mat img0 =image;// imread("/home/philipp/img/apple.jpg", 1);
Mat img1;
cvtColor(img0, img1, CV_RGB2GRAY);
// apply your filter
Canny(img1, img1, 100, 200);
// find the contours
vector< vector<cv::Point> > contours;
findContours(img1, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
/////for SQUARE CODE
std::vector<std::vector<cv::Point> > squares;
std::vector<cv::Point> approx;
for( size_t i = …Run Code Online (Sandbox Code Playgroud) 在进行一些边缘和角点检测然后找到轮廓后,我有这个输出.
如何裁剪此图像并使用openCV仅返回此矩形
编辑:
我尝试了cvBoundingRect然后setimageROI但输出图像仍然有一些背景但我只想要矩形
谢谢.

我刚刚开始尝试使用OpenCV.我有一个静态位置的LCD设置,我想从图像中提取屏幕上显示的内容.我已经看到用于校准相机的棋盘图案,但似乎这用于不影响图像,这不完全是我想要做的.
我想我会在液晶显示屏上显示棋盘,然后找出将液晶显示屏的图像转换成直接在头顶和裁剪的棋盘理想视图所需的转换.然后我会存储转换,更改LCD显示的内容,拍照,执行相同的转换,并获得现在正在显示的内容的理想视图.
我想知道这听起来是个好主意吗?有没有更简单的方法来实现我想要做的事情?关于函数的任何提示我应该用来计算转换,执行它们,存储它们(可能只是将转换矩阵保存在内存中或将它们写入文件中)等等?
我正在尝试实施逆透视图以计算到道路上另一辆车的距离.我知道我需要在应用函数之前生成包含源点和目标点的变换矩阵warpPerspective(),但我不知道如何计算目标点.
我搜索了这个论坛和其他网站,但我无法将第一张图片转换为第二张图片:
我在检测特定类型的对象方面取得了一些进展.实际上是一张卡片,就像你钱包里的其他卡片一样.
现在我不得不纠正这张照片了.看到:

蓝色(圆角)矩形表示检测到的轮廓.紫色旋转矩形表示RotatedRect从检测到的轮廓中提取的.绿线就是边界框.
好吧,我不需要那些矩形.矩形都有90度角.哪个不会让我有所了解.
我的问题:
如何从轮廓中获得所有四边形角的尽可能准确?
opencv ×9
c++ ×4
objective-c ×4
ios ×3
c ×2
iphone ×2
python ×2
cocoa-touch ×1
java ×1
math ×1
perspective ×1
sudoku ×1