2017-11-01 2 views
1

Im 프로그래밍 및 opencv에 새로운 기능이있어서 색상 분할을 사용하여 hdd를 감지하려고합니다. 내 코드는 지금까지 이미지를로드 다른 색상으로 3 마스크를 생성하고 비 제로 포인트 주위에 수직 경계 상자립니다고정 된 각도없이 이미지에 회전 된 경계 상자 그리기

int main(int argc, char** argv) 
{ 

//Load the image 
Mat img = imread(argv[1], 1); 
if (img.empty()){ 
cout << "No image found..." << endl; 
return -1; 
} 

//Extracting colors - BGR 
Mat silver, white, black; 

//Silver 
inRange(img, Scalar(180, 180, 180), Scalar(200, 200, 200), silver); 

//White 
inRange(img, Scalar(240, 240, 240), Scalar(255, 255, 255), white); 

//Black 
inRange(img, Scalar(0, 0, 0), Scalar(30, 30, 30), black); 

// logical OR mask 
Mat1b mask = silver | white | black; 

// Find non zero pixels 
vector<Point> pts; 

findNonZero(mask, pts); 

cout << "Non-Zero Locations = " << pts << endl << endl; // get non zero coordinates 

// Compute bounding box 

Rect box = boundingRect(pts); 

// Show bounding box 
rectangle(img, box, Scalar(0, 0, 255), 3); 
namedWindow("box", CV_WINDOW_NORMAL); 
imshow("box", img); 
imshow("mask", mask); 

waitKey(0); 
destroyAllWindows; 

return 0;} 

가 지금은 작은 경계 상자를 그리려을, 그래서 나는

를 사용하려고
cv::RotatedRect box2 = cv::minAreaRect(pts); 

대신. 내가

RotatedRect box2 = minAreaRect(pts); 

에러 출력과

Rect box = boundingRect(pts); 

을 대체하여 그것을 시각화 할 때 그러나 컴파일 나던 다음 cv::Rectangle Opencv Docs 당으로

error: no matching function for call to ‘rectangle(cv::Mat&, cv::RotatedRect&, cv::Scalar, int)’ 
rectangle(img, box2, Scalar(0, 0, 255), 3); 
+0

무엇 스택 추적입니까? 어디에서 붙어 있나요? – ZdaR

+0

그게 당신이 의미 한 것입니까? 게시물을 수정하는 것이 옳은가요? 아니면 코멘트에 변경 사항을 적용해야합니까? 죄송합니다. 빠른 답장을 보내 주셔서 감사합니다. –

+0

과부하가 없기 때문에 "크래시"란 말은 컴파일도되지 않습니다. [docs] (https://docs.opencv.org/3.3.0/d6/d6e/group__imgproc__draw.html)를 읽으십시오. ! [기존 튜토리얼] (https://docs.opencv.org/3.3.0/dd/d49/tutorial_py_contour_features.html)을 참조하십시오. 파이썬을 사용하더라도 회전 된 사각형을 그릴 수 있습니다. 'boxPoints'를 사용하고'drawContours'를 사용하여 결과를 렌더링하십시오. 왜 똑같은 방법을 시도해 보지 않으시겠습니까? –

답변

1

, 함수는 단지 2 변종이 있습니다

void rectangle(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0) 

void rectangle(Mat& img, Rect rec, const Scalar& color, int thickness=1, int lineType=8, int shift=0) 

따라서 cv::Rect 또는 cv::Point 만 허용됩니다. 따라서 위에서 언급 한 오류가 발생하여 cv::RotatedRect을 직접 입력 할 수 없습니다.

cv::Point2f points[4]; 
rotatedRect.points(points); 

을 그리고 다음과 같이 쌍으로 가장자리를 그릴 cv::line()를 사용 :

이 문제를 해결하려면, 당신은 사용 cv::RotatedRect의 4 점을 추출 할 수 있습니다

cv::RotatedRect rotatedRect = cv::RotatedRect(cv::Point(70, 70), cv::Size(90, 90), 30); 

cv::Mat canvas = cv::Mat(200, 200, CV_8UC3, cv::Scalar(255, 255, 255)); 

cv::Point2f points[4]; 
rotatedRect.points(points); 

cv::line(canvas, points[0], points[1], cv::Scalar(0, 255, 0), 3); 
cv::line(canvas, points[1], points[2], cv::Scalar(0, 255, 0), 3); 
cv::line(canvas, points[2], points[3], cv::Scalar(0, 255, 0), 3); 
cv::line(canvas, points[3], points[0], cv::Scalar(0, 255, 0), 3); 

enter image description here

+0

대단히 고마워, 이건 내가 원한거야! –

관련 문제