我想通过获取所有方向的图片(天花板)(360° - 例如电影帧),通过边缘检测识别墙壁,删除其他不需要的物体,在正确的位置连接图像来创建房间的简单2D地图(参见墙,全景)并最终创建近似的2D地图(从上面看).获得比例将是另一个参数,这可能是有用的.
我现在有一些自己的想法,例如使用索贝尔算法,但如果有人知道某些项目或软件(GPL,免费软件首选)已经这样做会很有意思,因为我还在寻找一些例子,这对我有帮助.
谢谢.
我想了解这段代码:
d=edge(d,'canny',.6);
figure,
imshow(d,[])
ds = bwareaopen(d,40);
figure,
imshow(ds,[])
iout = d1;
BW=ds;
iout(:,:,1) = iout;
iout(:,:,2) = iout(:,:,1);
iout(:,:,3) = iout(:,:,1);
iout(:,:,2) = min(iout(:,:,2) + BW, 1.0);
iout(:,:,3) = min(iout(:,:,3) + BW, 1.0);
Run Code Online (Sandbox Code Playgroud)
据我所知,应用d了图像和精确探测器,忽略了40个像素.图像为灰度,轮廓添加到图像中.
你能解释下一行吗?这里使用了什么原理/算法?我遇到了麻烦,尤其是代码的轮廓检测部分.
具体来说,我试图从游戏'小行星'的截图中提取所有相关的线段.我已经查看了各种边缘检测方法,但似乎没有一个方法适合我的问题有两个原因:
它们检测平滑的轮廓,而我只需要检测直线段,而只检测一定长度范围内的直线段.现在,这些约束应该使我的任务比一般情况更容易,但我不想只使用一个完整的边缘检测器,然后清除曲线的结果,因为这将是非常昂贵的.速度对我的目的至关重要.
它们输出修改后的图像,其中边缘是高光,而我想要一组像素坐标来描绘检测到的线段的端点.或者,每个段中包括的所有像素的列表也将起作用.
我有一个暗示,一个可能的解决方案将涉及霍夫变换,但我不知道如何使用它来获得线段的实际位置(即像素空间中的端点).虽然我做了,但我不知道这是否是最简单或最有效的做事方式,因此问题标题的一般措辞.
最后,这是一个示例图像:

请注意,所有主线的长度和密度都相似,并且整体图像对比度非常高.我希望我的问题的解决方案将利用这些功能,因为再次,效率是至关重要的.
需要注意的是:虽然这个上下文中的大多数线段都是多边形的一部分,但我不想要一个依赖于这个事实的解决方案.
image-processing feature-extraction computer-vision edge-detection
我想尝试文本识别,所以我使用opencv来查找边缘和c ++以找到斜率,曲线等,边缘算法适用于大而整齐的字符组但是当它出现在小字体上时或者有很多背景噪音的文字,如嵌入在验证码中,它会挣扎并且看起来不完整,我的猜测是我没有正确设置阈值并尝试不同的值而没有成功.


这是我的代码:
#include "cv.h"
#include "highgui.h"
using namespace cv;
const int low_threshold = 50;
const int high_threshold = 150;
int main()
{
IplImage* newImg;
IplImage* grayImg;
IplImage* cannyImg;
newImg = cvLoadImage("ocv.bmp",1);
grayImg = cvCreateImage( cvSize(newImg->width, newImg->height), IPL_DEPTH_8U, 1 );
cvCvtColor( newImg, grayImg, CV_BGR2GRAY );
cannyImg = cvCreateImage(cvGetSize(newImg), IPL_DEPTH_8U, 1);
cvCanny(grayImg, cannyImg, low_threshold, high_threshold, 3);
cvNamedWindow ("Source", 1);
cvNamedWindow ("Destination",1);
cvShowImage ("Source", newImg );
cvShowImage ("Destination", cannyImg );
cvWaitKey(0);
cvDestroyWindow ("Source" );
cvDestroyWindow ("Destination" );
cvReleaseImage (&newImg );
cvReleaseImage (&grayImg …Run Code Online (Sandbox Code Playgroud) 我正试图从图像中检测指尖的位置.我已经能够在图像中裁剪出必须有指尖的区域,并使用Canny Edge Detector提取边缘.但是我被卡住了.由于我的项目描述说我无法使用肤色进行检测,因此无法找到手指的确切轮廓,并且必须尝试将指尖与边缘单独分开.现在我在想,因为手指有弧形拱形/字母U形,也许可以用于检测.但由于它必须是旋转/比例不变的,我到目前为止发现的大多数算法都不符合它.有没有人知道如何做到这一点?感谢任何响应的人!

这是我现在的结果.我想在索引指尖或最高指尖周围放一个边界框,以最简单的方式.
我正在将ciimage转换为单色,使用CICrop进行剪裁并运行sobel来检测边缘,底部的#if部分用于显示结果
CIImage *ci = [[CIImage alloc] initWithCGImage:uiImage.CGImage];
CIImage *gray = [CIFilter filterWithName:@"CIColorMonochrome" keysAndValues:
@"inputImage", ci, @"inputColor", [[CIColor alloc] initWithColor:[UIColor whiteColor]],
nil].outputImage;
CGRect rect = [ci extent];
rect.origin = CGPointZero;
CGRect cropRectLeft = CGRectMake(0, 0, rect.size.width * 0.2, rect.size.height);
CIVector *cropRect = [CIVector vectorWithX:rect.origin.x Y:rect.origin.y Z:rect.size.width* 0.2 W:rect.size.height];
CIImage *left = [gray imageByCroppingToRect:cropRectLeft];
CIFilter *cropFilter = [CIFilter filterWithName:@"CICrop"];
[cropFilter setValue:left forKey:@"inputImage"];
[cropFilter setValue:cropRect forKey:@"inputRectangle"];
// The sobel convoloution will produce an image that is 0.5,0.5,0.5,0.5 whereever the image is flat
// …Run Code Online (Sandbox Code Playgroud) 我试图检测图像中的弯曲输送机.我使用以下代码使用Hough变换来检测其边缘
%# load image, and process it
I = imread('ggp\2.jpg');
g = rgb2gray(I);
bw = edge(g,'Canny');
[H,T,R] = hough(bw);
P = houghpeaks(H,500,'threshold',ceil(0.4*max(H(:))));
% I apply houghlines on the grayscale picture, otherwise it doesn't detect
% the straight lines shown in the picture
lines = houghlines(g,T,R,P,'FillGap',5,'MinLength',50);
figure, imshow(g), hold on
for k = 1:length(lines)
xy = [lines(k).point1; lines(k).point2];
deltaY = xy(2,2) - xy(1,2);
deltaX = xy(2,1) - xy(1,1);
angle = atan2(deltaY, deltaX) * 180 / pi;
if (angle == 0)
plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green'); …Run Code Online (Sandbox Code Playgroud) matlab image-processing computer-vision edge-detection hough-transform
我正在使用15*15像素的二进制方形图像.
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 1 1 1 1 1 1 1 1 1 0 0
0 0 0 1 1 1 1 …
以下是我正在使用的示例图像:
在每个图像上都有一个测量条.测量条的尺寸和角度可以变化.我已经确定了与测量条的某些交点,现在需要确定它对应的数字(例如256,192,128 ......).所以我需要识别像素范围并将每个像素映射到一个数字.为了识别这些范围,似乎唯一的方法是检测每个数字旁边的小线并将它们连接成更大的线.
我的计划是隔离这些小的测量线,然后使用HoughTransform连接它们之间的线,但是我发现很难隔离这些小线.我尝试过Canny边缘检测,但小的测量线总是作为垂直边缘的一部分被检测到.我尝试了许多不同的阈值和升级,没有成功.
img = cv2.imread('example.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
resized = cv2.resize(gray,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)
blur_gray = cv2.GaussianBlur(resized,(5, 5),0)
edges = cv2.Canny(blur_gray, 100, 200)
Run Code Online (Sandbox Code Playgroud)
升级x2 vs Upscaled x10
这甚至是正确的方法还是我可以使用另一种方法来提取这些测量线?
python opencv image-processing edge-detection canny-operator