Ich entwickle ein Projekt zur Identifizierung von Komponenten mit dem Javacv-Paket (Opencv). Ich eine Methode verwendet, um Rückkehr der Rechtecke auf dem Bild gesetzt als „CvSeq“ Was ich wissen muss, ist, wie folgende Dinge zu tunWie extrahiert man Breite und Höhe der Kontur in javacv?
- Wie kann ich jedes Rechteck von Methoden Ausgabe zu erhalten (von CvSeq)?
- Wie auf die Längen und die Breite des Rechtecks zugreifen?
Dies ist die Methode, die die Rechtecke
public static CvSeq findSquares(final IplImage src, CvMemStorage storage)
{
CvSeq squares = new CvContour();
squares = cvCreateSeq(0, sizeof(CvContour.class), sizeof(CvSeq.class), storage);
IplImage pyr = null, timg = null, gray = null, tgray;
timg = cvCloneImage(src);
CvSize sz = cvSize(src.width() & -2, src.height() & -2);
tgray = cvCreateImage(sz, src.depth(), 1);
gray = cvCreateImage(sz, src.depth(), 1);
pyr = cvCreateImage(cvSize(sz.width()/2, sz.height()/2), src.depth(), src.nChannels());
// down-scale and upscale the image to filter out the noise
cvPyrDown(timg, pyr, CV_GAUSSIAN_5x5);
cvPyrUp(pyr, timg, CV_GAUSSIAN_5x5);
cvSaveImage("ha.jpg", timg);
CvSeq contours = new CvContour();
// request closing of the application when the image window is closed
// show image on window
// find squares in every color plane of the image
for(int c = 0; c < 3; c++)
{
IplImage channels[] = {cvCreateImage(sz, 8, 1), cvCreateImage(sz, 8, 1), cvCreateImage(sz, 8, 1)};
channels[c] = cvCreateImage(sz, 8, 1);
if(src.nChannels() > 1){
cvSplit(timg, channels[0], channels[1], channels[2], null);
}else{
tgray = cvCloneImage(timg);
}
tgray = channels[c]; // try several threshold levels
for(int l = 0; l < N; l++)
{
// hack: use Canny instead of zero threshold level.
// Canny helps to catch squares with gradient shading
if(l == 0)
{
// apply Canny. Take the upper threshold from slider
// and set the lower to 0 (which forces edges merging)
cvCanny(tgray, gray, 0, thresh, 5);
// dilate canny output to remove potential
// // holes between edge segments
cvDilate(gray, gray, null, 1);
}
else
{
// apply threshold if l!=0:
cvThreshold(tgray, gray, (l+1)*255/N, 255, CV_THRESH_BINARY);
}
// find contours and store them all as a list
cvFindContours(gray, storage, contours, sizeof(CvContour.class), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);
CvSeq approx;
// test each contour
while (contours != null && !contours.isNull()) {
if (contours.elem_size() > 0) {
approx = cvApproxPoly(contours, Loader.sizeof(CvContour.class),storage, CV_POLY_APPROX_DP, cvContourPerimeter(contours)*0.02, 0);
if(approx.total() == 4
&&
Math.abs(cvContourArea(approx, CV_WHOLE_SEQ, 0)) > 1000 &&
cvCheckContourConvexity(approx) != 0
){
double maxCosine = 0;
//
for(int j = 2; j < 5; j++)
{
// find the maximum cosine of the angle between joint edges
double cosine = Math.abs(angle(new CvPoint(cvGetSeqElem(approx, j%4)), new CvPoint(cvGetSeqElem(approx, j-2)), new CvPoint(cvGetSeqElem(approx, j-1))));
maxCosine = Math.max(maxCosine, cosine);
}
if(maxCosine < 0.2){
cvSeqPush(squares, approx);
}
}
}
contours = contours.h_next();
}
contours = new CvContour();
}
}
return squares;
}
Dies ist die Probe Originalbild zurückgibt, die ich
verwendet Und das ist das Bild, das ich nach dem Zeichnen von Linien bekam um die passenden Rechtecke
Eigentlich bin ich in den obigen Bildern gebunden, um diese großen Rechtecke zu entfernen und nur andere Rechtecke zu identifizieren, also brauche ich ein Codebeispiel, um zu verstehen, wie man obige Ziele archiviert. Bitte sei so freundlich, deine Erfahrungen mit mir zu teilen. Vielen Dank !
Eigentlich brauche ich zwei große Rechtecke in Seite zu entfernen, sollte das Bild und andere kleine Rechtecke identifiziert werden. Bitte erklären Sie, wie man das mit javacv macht. –
Es tut mir leid, ich habe es nicht verstanden. Vielleicht kannst du malen, welches Quadrat du in grüner Farbe benötigst und irgendwo hochladen und hier einen Link geben. –
K, ich habe es .. du brauchst nur kleine Rechtecke und meide große Rechtecke, oder? Sie können sie vermeiden, wenn ihre Länge oder Breite größer als ein Schwellenwert ist. –