我在我的测试应用程序中成功实现了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) 我打算编写一个程序来检测和区分某些对象与几乎可靠的背景.前景和背景具有高对比度差异,我将进一步增加以帮助对象识别过程.我打算使用Hough变换技术和OpenCV.
如上图所示,我想分别识别圆形物体和方形物体(或有限形状的任何其他形状).由于我对图像处理很陌生,我不知道这种情况是否需要实现神经网络以及预先学习的每个形状.模板匹配等技术是否可以让我在没有神经网络的情况下实现这一目标?
嗨,目前我正在开发一个OCR阅读应用程序,我已成功地使用AVFoundation框架捕获卡片图像.
下一步,我需要找出卡的边缘,以便我可以从主捕获的图像中裁剪卡片图像,然后我可以将其发送到OCR引擎进行处理.
现在的主要问题是找到卡的边缘,我正在使用下面的代码(取自另一个开源项目),该代码使用OpenCV用于此目的.如果卡是纯矩形卡或纸,它工作正常.但是当我使用圆角卡(例如驾驶执照)时,它无法检测到.另外我在OpenCV上没有太多的专业知识,任何人都可以帮我解决这个问题吗?
- (void)detectEdges
{
cv::Mat original = [MAOpenCV cvMatFromUIImage:_adjustedImage];
CGSize targetSize = _sourceImageView.contentSize;
cv::resize(original, original, cvSize(targetSize.width, targetSize.height));
cv::vector<cv::vector<cv::Point>>squares;
cv::vector<cv::Point> largest_square;
find_squares(original, squares);
find_largest_square(squares, largest_square);
if (largest_square.size() == 4)
{
// Manually sorting points, needs major improvement. Sorry.
NSMutableArray *points = [NSMutableArray array];
NSMutableDictionary *sortedPoints = [NSMutableDictionary dictionary];
for (int i = 0; i < 4; i++)
{
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSValue valueWithCGPoint:CGPointMake(largest_square[i].x, largest_square[i].y)], @"point" , [NSNumber numberWithInt:(largest_square[i].x + largest_square[i].y)], @"value", nil];
[points addObject:dict];
}
int min = …Run Code Online (Sandbox Code Playgroud) 要跟踪视频帧上的对象,首先我从视频中提取图像帧并将这些图像保存到文件夹中.然后我应该处理这些图像以找到一个对象.实际上我不知道这是否是实用的,因为所有的算法都是一步完成的.它是否正确?
我有一个OpenCV应用程序来自办公室内部的网络摄像头流(很多细节),我必须找到一个人工标记.标记是在白色背景的一个黑角规.我使用Canny来查找边缘和cvFindContours进行轮廓加工,然后使用aboutPolyDP和co.用于过滤和查找候选者,然后使用局部直方图进一步过滤,bla bla bla ...
这或多或少有效,但不完全是我想要的.FindContours总是返回一个闭环,即使Canny创建一个非闭合线.我得到一个轮廓走在线的两侧形成一个环.对于坎尼图像(我的标记)上封闭的边缘,我得到2个轮廓,一个在里面,和其他在外面.我不得不对这个操作有问题:
我为每个标记得到2个轮廓(不是那么严重)
最简单的过滤是不可用的(拒绝非闭合轮廓)
所以我的问题是:是否可以为非封闭的Canny边缘获得非闭合轮廓? 或者解决上述两个问题的标准方法是什么?
Canny是一个非常好的工具,但我需要一种方法将2D黑白图像转换为易于处理的东西.类似连接组件的东西,列出组件的步行顺序中的所有像素.所以我可以过滤循环,并将其提供给approxPolyDP.
更新:我错过了一些重要的细节:标记可以处于任何方向(它不是面向摄像机的正面,没有直角),实际上我正在做的是3D方向估计,基于标记的2D投影.
我正在努力从BufferedImage中提取快速有效的矩形字.
例如,我有以下页面:(编辑!)图像被扫描,因此它可能包含噪音,歪斜和失真.

如何在没有矩形的情况下提取以下图像:(编辑!)我可以使用OpenCv或任何其他库,但我是高级图像处理技术的新手.

编辑
我已经使用了karlphillip 这里建议的方法,它工作得体.
这是代码:
package ro.ubbcluj.detection;
import java.awt.FlowLayout;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.WindowConstants;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;
public class RectangleDetection {
public static void main(String[] args) throws IOException {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat image = loadImage();
Mat grayscale = convertToGrayscale(image);
Mat treshold = tresholdImage(grayscale);
List<MatOfPoint> contours …Run Code Online (Sandbox Code Playgroud) 我试着在窗口中实时绘制形状.形状类似于缠结,矩形,圆形,半圆形或圆形,屏幕中的"Z"使用黄色.尺寸和形状可能与原始图像不同.但程序知道所有原始形状.因为它们是预定义的.我想知道如何识别正确的形状.举个例子,

有可能这样做吗?我可以使用模板匹配吗?请在这件事上给予我帮助..
我有一个包含正方形的图像,我需要提取该正方形中包含的区域.在应用了square.c脚本(在每个OpenCV分布的样本中可用)后,我获得了一个正方形向量,然后我需要为它们中的每个保存一个图像.
用户karlphillip建议:
for (size_t x = 0; x < squares.size(); x++)
{
Rect roi(squares[x][0].x, squares[x][0].y,
squares[x][1].x - squares[x][0].x,
squares[x][3].y - squares[x][0].y);
Mat subimage(image, roi);
}
Run Code Online (Sandbox Code Playgroud)
为了在原始图像中检测到的所有方块生成一个称为子图像的新Mat
正如卡尔记得的那样,图像中检测到的点可能并不代表一个完美的正方形(如上图所示),但我刚给你建议的代码假设他们这样做了.
实际上我收到了这个错误:
OpenCV Error: Assertion failed (0 <= roi.x && 0 <= roi.width &&
roi.x + roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height &&
roi.y + roi.height <= m.rows) in Mat, file /usr/include/opencv/cxmat.hpp,
line 187
terminate called after throwing an instance of 'cv::Exception'
what(): /usr/include/opencv/cxmat.hpp:187: error: …Run Code Online (Sandbox Code Playgroud) 我试图在此图像中找到居中框的边缘:

我尝试使用houghLines使用dRho = img_width/1000,dTheta = pi/180,阈值= 250它在这个图像上效果很好,缩放到大小的1/3,但在全尺寸图像上它只是到处都是线条在各个方向......
我可以做些什么来调整这个更准确?