簡體   English   中英

如何使用javacv識別長度和寬度可變的方形或矩形?

[英]How to identify square or rectangle with variable lengths and width by using javacv?

我正在使用java開發項目來識別使用opencv包的組件,但我是javacv的新手,我只是想知道如何識別特定源圖像中的矩形,請一些經驗人員給出一些基本的指導來存檔這個任務。 我嘗試在這里使用模板匹配,但它只能識別確切大小的矩形。 但在我的情況下,我需要識別變長矩形?

import java.util.Arrays;
import static com.googlecode.javacv.cpp.opencv_core.*;
import static com.googlecode.javacv.cpp.opencv_imgproc.*;
import static com.googlecode.javacv.cpp.opencv_highgui.*;
public class TestingTemplate {
public static void main(String[] args) {
//Original Image
IplImage src = cvLoadImage("src\\lena.jpg",0);
//Template Image
IplImage tmp = cvLoadImage("src\\those_eyes.jpg",0);
//The Correlation Image Result
IplImage result = cvCreateImage(cvSize(src.width()-tmp.width()+1, src.height()-tmp.height()+1), IPL_DEPTH_32F, 1);
//Init our new Image
cvZero(result);
cvMatchTemplate(src, tmp, result, CV_TM_CCORR_NORMED);

double[] min_val = new double[2];
double[] max_val = new double[2];

//Where are located our max and min correlation points
CvPoint minLoc = new CvPoint();
CvPoint maxLoc = new CvPoint();
cvMinMaxLoc(result, min_val, max_val, minLoc, maxLoc, null); //the las null it's for
 optional mask mat()

System.out.println(Arrays.toString(min_val)); //Min Score
System.out.println(Arrays.toString(max_val)); //Max Score

CvPoint point = new CvPoint();
point.x(maxLoc.x()+tmp.width());
point.y(maxLoc.y()+tmp.height());
cvRectangle(src, maxLoc, point, CvScalar.WHITE, 2, 8, 0); //Draw the rectangule result in original img.
cvShowImage("Lena Image", src);
cvWaitKey(0);
//Release
cvReleaseImage(src);
cvReleaseImage(tmp);
cvReleaseImage(result);
}
}

請有人幫助完成此任務

(因此它被固定為方形。)

對於方形檢測,OpenCV附帶了一些樣本。 代碼使用C ++,C,Python。 希望你能把它移植到JavaCV。

C ++代碼Python代碼

我將只說明它是如何工作的:

1 - 首先將圖像分割為R,G,B平面。

2 - 然后為每個平面執行邊緣檢測 ,除此之外,還有不同值的值,如50,100,......等。

3 - 在所有這些二進制圖像中, 找到輪廓 (記住它正在處理大量圖像,所以可能有點慢,如果你不想要,你可以刪除一些閾值)。

4 - 找到輪廓后, 根據區域過濾去除一些小的不需要的噪音。

5 - 然后, 近似輪廓 關於輪廓近似的更多信息 )。

6 - 對於一個矩形,它會給你四個角。 對於其他人,將給出相應的角落。

因此,根據近似輪廓中應為4的元素數量過濾這些輪廓,這與角數相同。 矩形的第一個屬性。

7 - 接下來,可能有一些形狀有四個角但不是矩形。 所以我們采用矩形的第二個屬性,即所有內角都是90° 因此,我們使用以下關系找到所有角落的角度:

在此輸入圖像描述

如果cos(theta)<0.1,即theta> 84度,那就是一個矩形。

8 - 那廣場怎么樣? 使用它的財產,所有方面都是平等的。

您可以通過上述關系找到兩點之間的距離。 檢查它們是否相等,然后該矩形是正方形。

這就是代碼的工作原理。

下面是我在圖像上應用上述代碼的輸出:

在此輸入圖像描述

編輯:

已經詢問如何刪除邊界處檢測到的矩形。 這是因為,opencv在黑色背景中找到白色物體,因此是邊框。 只需使用cv2.bitwise_not()函數反轉圖像就可以解決問題。 我們得到如下結果:

在此輸入圖像描述

您可以在此處找到有關輪廓的更多信息: 輪廓 - 1:入門

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM