2012-12-10 2 views
0

안녕하세요, OpenCV를 사용하여 사각형/사각형을 감지하는 안드로이드 응용 프로그램을 사용하고 있습니다. squares.cpp에서 함수 (수정 됨)를 사용하고 있습니다. 각 사각형의 점을 벡터> 사각형에 저장하고있는 것을 확인한 다음 가장 큰 것을 선택하고 벡터 theBiggestSq에 저장하는 함수로 전달합니다. 문제는 아래에 붙여 넣기 코드 (나는 문제를 너무 보여주는 YouTube 링크를 게시 할 것입니다) 자르기 기능입니다. 실제 스퀘어가 카메라에서 충분히 멀리 떨어져 있으면 괜찮습니다. 그러나 어느 정도 지점을 닫으면 멈 춥니 다. LogCat에서 문제의 인쇄 화면을 게시하고 인쇄 된 점이 있습니다 (경계 점은 theBiggestSq 벡터에서 가져온 것이므로 해결책을 찾는데 도움이 될 수 있습니다). 각각 인쇄OpenCV 자르기 기능 치명적인 신호 11

void cutAndSave(vector<Point> theBiggestSq, Mat image){ 
    RotatedRect box = minAreaRect(Mat(theBiggestSq)); 
    // Draw bounding box in the original image (debug purposes) 
    //cv::Point2f vertices[4]; 
    //box.points(vertices); 
    //for (int i = 0; i < 4; ++i) 
    //{ 
    //cv::line(img, vertices[i], vertices[(i + 1) % 4], cv::Scalar(0, 255, 0), 1, CV_AA); 
    //} 
    //cv::imshow("box", img); 
    //cv::imwrite("box.png", img); 
    // Set Region of Interest to the area defined by the box 
    Rect roi; 
    roi.x = box.center.x - (box.size.width/2); 
    roi.y = box.center.y - (box.size.height/2); 
    roi.width = box.size.width; 
    roi.height = box.size.height; 
    // Crop the original image to the defined ROI 

    //bmp=Bitmap.createBitmap(box.size.width/2, box.size.height/2, Bitmap.Config.ARGB_8888); 
    Mat crop = image(roi); 
    //Mat crop = image(Rect(roi.x, roi.y, roi.width, roi.height)).clone(); 
    //Utils.matToBitmap(crop*.clone()* ,bmp); 
    imwrite("/sdcard/OpenCVTest/1.png", bmp); 
    imshow("crop", crop); 

} 

video of my app and its problems

enter image description here

코드는 다음과 같습니다 roi.x roi.y roi.width roi.height

또 다른 문제는 그린 경계가 녹색을해야한다는 것입니다 그러나 비디오에서 보았 듯이 왜곡되어 있습니다 (경계가 유리로 만들어 지듯이 구부러져 있습니까?).

도움 주셔서 감사합니다. 나는 openCV에서 단 한 달 만에 처음이에요. 그러니 용납하시기 바랍니다.

편집 : 그리기 코드 :

//draw// 
    for(size_t i = 0; i < squares.size(); i++) 
    { 
     const Point* p = &squares[i][0]; 
     int n = (int)squares[i].size(); 
     polylines(mBgra, &p, &n, 1, true, Scalar(255,255,0), 5, 10); 
     //Rect rect = boundingRect(cv::Mat(squares[i])); 
     //rectangle(mBgra, rect.tl(), rect.br(), cv::Scalar(0,255,0), 2, 8, 0); 

    } 

답변

2

이 오류는 기본적으로 당신에게 원인을 알 - 투자 수익 (ROI)은 이미지 크기를 초과합니다. 즉, Rect roiRotatedRect box에서 추출 할 때 x 또는 y가 0보다 작거나 너비/높이가 이미지 바깥으로 치수를 푸시합니다.

// Propose rectangle from data 
int proposedX = box.center.x - (box.size.width/2); 
int proposedY = box.center.y - (box.size.height/2); 
int proposedW = box.size.width; 
int proposedH = box.size.height; 

// Ensure top-left edge is within image 
roi.x = proposedX < 0 ? 0 : proposedX; 
roi.y = proposedY < 0 ? 0 : proposedY; 

// Ensure bottom-right edge is within image 
roi.width = 
    (roi.x - 1 + proposedW) > image.cols ? // Will this roi exceed image? 
    (image.cols - 1 - roi.x)    // YES: make roi go to image edge 
    : proposedW;       // NO: continue as proposed 
// Similar for height 
roi.height = (roi.y - 1 + proposedH) > image.rows ? (image.rows - 1 - roi.y) : proposedH; 
+0

이렇게하면이 오류가 다시 발생하지 않도록하거나 '너비/높이가 이미지 외부 치수를 푸시합니다.'라는 메시지 만 확인하면됩니다. – silvestrairwave

+0

테스트를 해보지는 않았지만 어떤 상자가 반환 되더라도 roi가 항상 이미지 내에 있는지 확인해야하며 오류가 발생하는 이미지 외부에 있다고 생각합니다. – Chris

+0

감사합니다. 나는 지금 그것을 시도하고 곧 결과를 게시 할 것입니다. 마지막으로 한 가지 : 발견 된 직사각형/사각형의 경계가 왜 그려지는지 알고 있습니까? 초록색이어야하지만 비디오에서 볼 수 있듯이 흰빛이 도는 유리물입니까? (설명하기가 어렵다). – silvestrairwave