我正在尝试制作一个计算机视觉程序,它可以在嘈杂的背景(如沙滩)中检测垃圾和随机垃圾.
原始图片:
没有任何图像处理的Canny边缘检测:
我意识到图像处理技术的某种组合将帮助我实现忽略嘈杂的沙质背景并检测地面上所有垃圾和物体的目标.
我尝试预先形成中位数模糊,玩转并调整参数,它给了我这个:
它在忽略沙质背景方面表现良好,但它无法检测到地面上的其他许多物体,可能是因为它模糊了(不太确定).
有没有办法改进我的算法或图像处理技术,忽略嘈杂的沙质背景,同时允许精确边缘检测找到所有对象,让程序检测并绘制所有对象的轮廓.
码:
from pyimagesearch.transform import four_point_transform
from matplotlib import pyplot as plt
import numpy as np
import cv2
import imutils
im = cv2.imread('images/beach_trash_3.jpg')
#cv2.imshow('Original', im)
# Histogram equalization to improve contrast
###
#im = np.fliplr(im)
im = imutils.resize(im, height = 500)
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
# Contour detection
#ret,thresh = cv2.threshold(imgray,127,255,0)
#imgray = cv2.GaussianBlur(imgray, (5, 5), 200)
imgray = cv2.medianBlur(imgray, 11)
cv2.imshow('Blurred', imgray)
'''
hist,bins = np.histogram(imgray.flatten(),256,[0,256])
plt_one = plt.figure(1)
cdf = hist.cumsum()
cdf_normalized = …Run Code Online (Sandbox Code Playgroud) opencv image-processing computer-vision edge-detection opencv-contour
我已经在ImageView中实现了FloodFill算法的实现。但是我无法在Camera(Android的Surface View)上实现它。我正在使用OpenCV库。我已经使用轮廓概念尝试了以下代码。但是我没有得到确切的结果。
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba();
if (mIsColorSelected) {
mDetector.process(mRgba);
List<MatOfPoint> contours = mDetector.getContours();
Log.e(TAG, "Contours count: " + contours.size());
for (int contourIdx = 0; contourIdx < contours.size(); contourIdx++) {
Imgproc.drawContours(mRgba, contours, contourIdx, new Scalar(0,
0, 100, 10), -1);
}
Mat colorLabel = mRgba.submat(4, 68, 4, 68);
colorLabel.setTo(mBlobColorRgba);
Mat spectrumLabel = mRgba.submat(4, 4 + mSpectrum.rows(), 70,
70 + mSpectrum.cols());
mSpectrum.copyTo(spectrumLabel);
}
return mRgba;
}
Run Code Online (Sandbox Code Playgroud)
任何人都知道该怎么做。提前致谢。
android opencv image-processing opencv4android opencv-contour
我正在尝试将稍微不规则的形状与形状数据库相匹配。例如,这里我试图匹配的轮廓:
有关更多信息,这是 HDMI 连接器的轮廓,表示为轮廓。有点粗糙,因为这是在拿着 HDMI 的情况下用手机拍摄的。
这是我的连接器数据库:
这些更清晰,因为这些是从互联网连接器图像中收集的轮廓。
对于我尝试过的:
cv2.matchShapes()
由于这些都只是轮廓,我尝试直接使用 matchShapes() 方法进行比较,但未能产生良好的结果。不规则轮廓和我的数据库之间的相似之处是:
HDMI:0.90
DB25:0.84
5 针 DIN:0.5
DVI:0.21
由于轮廓越相似,匹配结果越接近 0,算法完全失败。我通过更改第三个参数尝试了其他匹配方法,但仍然不成功。
球体:
与SIFT类似,我尝试了关键点匹配。平均我数据库中不同匹配项之间的距离(在找到前 15% 的匹配项之后):
mean([m.distance for m in matches])
Run Code Online (Sandbox Code Playgroud)
距离如下:
五针DIN:7.6
DB25:11.7
DVI:12.1
HDMI:19.6
由于这将圆形归类为最像我的轮廓的形状,因此这也失败了。
以下是实际 HDMI 插槽与我的示例 HDMI 插槽的 ORB 匹配的关键点,以获取更多信息:

我应该尝试任何想法/其他算法吗?或者 CNN 是我唯一的选择(我宁愿避免,因为我没有适当数量的数据)。
python opencv image-processing image-recognition opencv-contour
我有几张图像需要通过使用计算机视觉检测复选框来进行OMR。
我正在使用findContours仅在扫描文档中的复选框上绘制轮廓。但是该算法提取文本的每个轮廓。
from imutils.perspective import four_point_transform
from imutils import contours
import numpy as np
import argparse, imutils, cv2, matplotlib
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
image = cv2.imread("1.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
edged = cv2.Canny(blurred, 75, 200)
im_test = [blurred, cv2.GaussianBlur(gray, (7, 7), 0), cv2.GaussianBlur(gray, (5, 5), 5), cv2.GaussianBlur(gray, (11, 11), 0)]
im_thresh = [ cv2.threshold(i, 127, 255, 0) for i in im_test ]
im_thresh_0 = [i[1] for i in im_thresh ] …Run Code Online (Sandbox Code Playgroud) python opencv image-processing computer-vision opencv-contour
我试图用openCV和python语言在轮廓的外部区域用黑色着色.这是我的代码:
contours, hierarchy = cv2.findContours(copy.deepcopy(img_copy),cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
areas = [cv2.contourArea(c) for c in contours]
max_index = np.argmax(areas)
cnt=contours[max_index]
# how to fill of black the outside of the contours cnt please? `
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Xamarin在Android构建中使用OpenCV找到图像的轮廓(有关下面版本的详细信息).
我无法让FindCountours函数返回任何轮廓(列表为空),即使使用如下的伪图像也是如此.另一个问题是层状物体中存在一个轮廓.
它在Windows上从Python运行时有效.
有谁知道原因是什么?
Mat aoiHsv = new Mat(new Size(80, 80), CvType.Cv8uc3);
for (int i = 20; i < 40; i++)
{
for (int j = 20; j < 40; j++)
{
aoiHsv.Put(i,j, new byte[] {180, 255, 255});
}
}
Mat mask = new Mat();
OpenCV.Core.Core.InRange(aoiHsv, new Scalar(179, 255, 255), new Scalar(255, 255, 255), mask);
// Find contours
IList<MatOfPoint> contours = new List<MatOfPoint>();
Mat hierachy = new Mat();
Imgproc.FindContours(mask, contours, hierachy, Imgproc.RetrCcomp, Imgproc.ChainApproxNone);
Run Code Online (Sandbox Code Playgroud)
版本信息:
找到解决方案: …
我正在学习OpenCv。我有一个斜齿轮图像来寻找牙齿。
到现在为止,我一直试图找到轮廓,然后计算牙齿。我能够找到轮廓以及轮廓的坐标。但是我坚持算数。由于我是OpenCV的新手,这可能是我尝试发现牙齿不正确的方式。
我的代码:
import cv2
import numpy as np
import scipy as sp
import imutils
from skimage.morphology import reconstruction
import csv
raw_image = cv2.imread('./Gear Image/new1.jpg')
#cv2.imshow('Original Image', raw_image)
#cv2.waitKey(0)
bilateral_filtered_image = cv2.bilateralFilter(raw_image, 5, 175, 175)
#cv2.imshow('Bilateral', bilateral_filtered_image)
#cv2.waitKey(0)
edge_detected_image = cv2.Canny(bilateral_filtered_image, 75, 200)
#cv2.imshow('Edge', edge_detected_image)
#cv2.waitKey(0)
contours, hierarchy = cv2.findContours(edge_detected_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contour_list = []
for contour in contours:
approx = cv2.approxPolyDP(contour,0.01*cv2.arcLength(contour,True),True)
area = cv2.contourArea(contour)
if ((len(approx) > 5) & (len(approx) < 25) & (area > 50) ):
contour_list.append(contour)
cv2.drawContours(raw_image, …Run Code Online (Sandbox Code Playgroud) 我正在尝试将最小边界框适合下面显示的每个“斑点”。作为图像处理管道的一部分,我使用 findContours 来检测数据中的轮廓,然后在给定一组已发现的轮廓的情况下绘制最小边界框。
最小边界框不是很准确——一些特征显然被遗漏了,而另一些特征则不能完全“封装”一个全连接的特征(而是被分割成几个小的最小边界框)。我玩过检索模式(如下所示的 RETR_TREE)和轮廓近似方法(如下所示的 CHAIN_APPROX_TC89_L1),但找不到我真正喜欢的东西。有人可以建议一种更强大的策略来使用 OpenCV Python 更准确地捕获这些轮廓吗?

import numpy as np
import cv2
# load image from series of frames
for x in range(1, 20):
convolved = cv2.imread(x.jpg)
original = convolved.copy
#convert to grayscale
gray = cv2.cvtColor(convolved, cv2.COLOR_BGR2GRAY)
#find all contours in given frame, store in array
contours, hierarchy = cv2.findContours(gray,cv2.RETR_TREE, cv2.CHAIN_APPROX_TC89_L1)
boxArea = []
#draw minimum bounding box around each discovered contour
for cnt in contours:
area = cv2.contourArea(cnt)
if area > 2 …Run Code Online (Sandbox Code Playgroud) python opencv computer-vision image-segmentation opencv-contour
我试图在一个二进制图像中找到轮廓,这是一个 numpy 数组
a = np.array(np.random.rand(1024,768),dtype='float32')
_, t2 = cv2.threshold(a,127,255,0)
im2, contours, hierarchy = cv2.findContours(t2,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
Run Code Online (Sandbox Code Playgroud)
当我尝试运行该代码时,出现此错误
OpenCV Error: Unsupported format or combination of formats
([Start]FindContours supports only CV_8UC1 images when
mode != CV_RETR_FLOODFILL otherwise supports CV_32SC1 images only)
in cvStartFindContours
Run Code Online (Sandbox Code Playgroud) 我已经能够制作自适应阈值并检测旋转角度(我不确定是否必须旋转图像)
我正在努力检测包含表单的矩形。我尝试了不同的方法,例如 opencv 的 findContours()。它能够找到的最大轮廓是一个带有名字的框。
之后我决定使用HoughLinesP,但它发现了很多行,我不知道如何过滤它们。检测矩形以校正表格也很方便,之后我将能够轻松阅读答案。所以我已经在考虑在角落添加黑色方形标记..但也许有人可以给我一些如何正确做的想法。
HoughLinesP(我使用 nodejs,但我可以阅读 python 和 c++):
const imageSize = {
width: gray.cols,
height: gray.rows
};
const threshold_min = 200;
const ratio_min_max = 1;
const edges = gray.canny(threshold_min,threshold_min*ratio_min_max,3);
const minLineLength = imageSize.width / 4,
maxLineGap = 10,
threshold = 100;
const lines = edges.houghLinesP(1, Math.PI/180, threshold, minLineLength, maxLineGap);
//draw lines on the output
for( let i = 0; i < lines.length; i++ ) {
const l = lines[i];
const {x,y,z,w} = l;
output.drawLine(
cv.Point(w, x), …Run Code Online (Sandbox Code Playgroud)opencv ×10
opencv-contour ×10
python ×6
android ×2
image ×1
numpy ×1
opencv3.0 ×1
python-2.7 ×1