我正在嘗試使用 OpenCV 執行線檢測,以便在衛星影像中選擇植被行。
我決定使用 OpenCV LineSegmentDetector,因為它似乎在單個代碼行中提供了我需要的東西,而不是使用 Hough 變換或其他需要一些額外作業和預處理的更復雜的方法。
但是,即使在最簡單的示例中,我也無法使其作業。
我的代碼:
Mat coco = imread("C:/Users/XX/Images/cococo.png", IMREAD_GRAYSCALE);
cv::LineSegmentDetector* lsd = cv::createLineSegmentDetector();
std::vector<cv::Vec4f> lines_std;
lsd->detect(coco, lines_std);
lsd->drawSegments(coco, lines_std);
在第 4 行:
lsd->detect(coco, lines_std)
無論我嘗試什么(OutputArray 中的不同型別,使用 cv::Mat 作為輸出等),我都會得到 AccessViolationException 或 NullPointerException。代碼幾乎與此處完全相同:https : //docs.opencv.org/4.6.0/df/dfa/tutorial_line_descriptor_main.html(可能是舊版本,因為我沒有定義“KeyLine”型別)
我知道由于許可問題,此功能在以前的 OpenCV 版本中已被洗掉,如官方檔案中所示:
由于原始代碼許可沖突,已從 OpenCV 版本 3.4.6 到 3.4.15 和版本 4.1.0 到 4.5.3 中洗掉了實作。在計算了根據 MIT 許可發布的 NFA 代碼后再次恢復。
...但由于我使用的是 OpenCV 4.6.0,我懷疑這不是問題所在。
我在 Visual Studio 2022 中為此測驗配置了一個新專案,并且我熟悉常用的 OpenCV 內容(在聯結器中添加包含檔案夾、靜態和動態庫等)。Mats 上的其他操作作業得很好。
我錯過了什么?
uj5u.com熱心網友回復:
多虧了 Micka 準確的建議,我才能夠追蹤到問題所在。似乎 cv::Ptr 是一項要求,標準 C 指標不起作用,即使在像這樣的相當簡單的設定中也是如此。我沒有意識到這一點。
我提供固定代碼以防萬一它對某人有幫助:
#include "stdafx.h"
#include "opencv2/opencv.hpp"
using namespace cv;
using namespace std;
int main() {
Mat img = imread("C:/Users/XX/Images/test.png", IMREAD_GRAYSCALE);
Mat resizedimg, resizedimgRGB;
resize(img, resizedimg, cv::Size(img.rows/16, img.cols/16));
cv::cvtColor(resizedimg, resizedimgRGB, COLOR_GRAY2BGR);
cv::Ptr<cv::LineSegmentDetector> lsd = cv::createLineSegmentDetector(0);
std::vector<cv::Vec4i> lines_std;
lsd->detect(resizedimg, lines_std);
lsd->drawSegments(resizedimgRGB, lines_std); // For some reason this does not work when lines_std coordinates are stored as doubles
/*
for (cv::Vec4d lin : lines_std) {
cv::line(resizedimgRGB, cv::Point(lin[0], lin[1]), cv::Point(lin[2], lin[3]), Scalar(255, 0, 0), 1);
}
*/
imshow("IMAGE", resizedimgRGB);
waitKey(0);
return 0;
}
一些變數名稱已更改為更易于解釋的名稱,此外,影像已調整大小以節省測驗之間的一些時間。
編輯:使用 LineSegmentDetector::drawSegments(...) 繪制線條時出現錯誤,由線條坐標上的小數引起。它是通過使用 cv::Vec4i (整數型別)而不是 cv::Vec4d 來存盤坐標來修復的。此更改不再需要注釋掉的回圈。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/521242.html
標籤:C opencv图像处理
