我目前堅持檢測預先計算的 NumPy 陣列中的霍夫線。但是,似乎我無法弄清楚為什么 OpenCV 不接受 NumPy 陣列來處理和檢測線條。錯誤訊息是指輸入通道,即便如此,我認為這應該自動檢測到,因為 OpenCV 本身使用 NumPy 陣列。
我在下面提供了一個最小的作業示例。但是,由于隨機值,線路檢測可能會失敗。
import numpy as np
import cv2
from matplotlib import pyplot as plt
format = 50
img = np.random.choice([0, 1], size=(format,format), p=[1/30, 29/30])
plt.imshow(img, interpolation='nearest')
plt.show()
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
minLineLength = 100
maxLineGap = 10
lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap)
for x1,y1,x2,y2 in lines[0]:
cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)
cv2.imshow('image',img)
cv2.waitKey(0)
錯誤資訊:
> cv2.error: OpenCV(4.2.0)
> ../modules/imgproc/src/color.simd_helpers.hpp:92: error:
> (-2:Unspecified error) in function
> 'cv::impl::{anonymous}::CvtHelper<VScn, VDcn, VDepth,
> sizePolicy>::CvtHelper(cv::InputArray, cv::OutputArray, int) [with
> VScn = cv::impl::{anonymous}::Set<3, 4>; VDcn =
> cv::impl::{anonymous}::Set<1>; VDepth = cv::impl::{anonymous}::Set<0,
> 2, 5>; cv::impl::{anonymous}::SizePolicy sizePolicy =
> cv::impl::<unnamed>::NONE; cv::InputArray = const cv::_InputArray&;
> cv::OutputArray = const cv::_OutputArray&]'
> Invalid number of channels in input image:
> 'VScn::contains(scn)'
> where
> 'scn' is 1
編輯: 我知道問題在于 numpy 陣列是二進制資料(0 或 1),但我不知道如何將其讀入以正確處理。
uj5u.com熱心網友回復:
正如評論中所寫,您的代碼中有幾個缺陷。
- 使用 Houghline 有機會找到線條的影像大小。
- 對于影像,
np.random.choise陣列必須轉換為unit8. - 結果可以用作灰度影像。
- 灰度影像中的顏色“白色”的值為 255。
- 如果要繪制顏色,則必須將影像轉換為 BGR。
- 白噪聲幾乎不會導致檢測到的線條。我特意在噪音中畫了一條線來演示,這條線可以將這條線與噪音區分開來。
您可以使用此作業示例開始并逐步將其編輯為您實際想要做的事情。
import numpy as np
import cv2
f = 500
img = np.random.choice([255, 0], size=(f, f), p=[1/30, 29/30]).astype("uint8")
cv2.line(img, (50, 50), (100, 300), 255, 2)
cv2.imshow('image', img)
cv2.waitKey(0)
minLineLength = 100
maxLineGap = 40
lines = cv2.HoughLinesP(img, 1, np.pi/180, 100, minLineLength, maxLineGap)
img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
if lines is not None:
for x1, y1, x2, y2 in lines[0]:
cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.imshow('image', img)
cv2.waitKey(0)
輸出:

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/519659.html
