2014-10-21 3 views
2

opencv에서 매트 파일을 만들고 0으로 초기화하려고합니다 (모든 픽셀을 검정색으로 초기화). 나는 그 이미지 내부의 위치와 약간의 사각형을 가지고 그 후히트 맵에서 투표와 같은 직사각형을 그립니다.

Mat img = Mat::zeros(image.rows, image.cols, CV_8UC1); 

을 나는 사각형 흰색의 대응 영역을 그리려 : 따라서 나는 초기화 목적으로 를 사용합니다. 어떻게 매트 파일에 영역을 그릴 수 있습니까?

나는 직사각형을 그리는 다음과 같은 기능을 가지고 있습니다. 그러나 경계 만이 아닌 모든 사각형을 그립니다. 중복 경계 상자 (가까운 255) 간단한 비 중첩 사각형 더 높은 값을 가질 수 있도록

static Mat image_draw(Mat image, vector<Rect> rect, CvScalar color){ 

for(int i = 0; i < faces.size(); i++) 
{ 
    Point pt1(rect[i].x + rect[i].width, rect[i].y + rect[i].height); 
    Point pt2(rect[i].x, rect[i].y); 
    rectangle(image, pt1, pt2, color, 5, 8, 0); 
} 
return image; 

}

는 내가 원하는 정확한 것은 내 직사각형 열 맵을 작성하는 것입니다. 나는 두께를 바꾼다 :

img = image_draw(img, rects, cvScalar(255, 102, 255, 0), -1); 

가변 rect는 0에서 10까지의 직사각형을 포함한다. 어떻게 든 사각형 그리기를 집계하고 싶습니다. 직사각형을 다시 그리기 만하면 안됩니다.

내가 functionize하려면

는 그렇게 somwthing한다 : 편집 최종 솔루션 :

static Mat heatmap2(Mat image1, vector<Rect> faces, CvScalar color, int thickness) { 

cv::Mat heatmap(image1.rows, image1.cols, CV_8U,cv::Scalar(0)); 

for(int i = 0; i < faces.size(); i++) 
{ 
    cv::Mat temp(image1.rows, image1.cols , CV_8U, cv::Scalar(0)); 
    Point pt1(faces[i].x + faces[i].width, faces[i].y + faces[i].height); 
    Point pt2(faces[i].x, faces[i].y); 
    rectangle(temp, pt1, pt2, color, thickness, 8, 0); 
    heatmap+=temp; 
} 

return heatmap; 

}

답변

3

이 시도 :

cv::Mat heatmap(200,300,CV_8U,cv::Scalar(0)); 
    { 
     cv::Mat temp(200,300,CV_8U,cv::Scalar(0)); 
     cv::Rect r(10,20,30,30); 
     cv::rectangle(temp,r,cv::Scalar(100),-1); 
     heatmap+=temp; 
    } 
    { 
     cv::Mat temp(200,300,CV_8U,cv::Scalar(0)); 
     cv::Rect r(20,25,30,30); 
     cv::rectangle(temp,r,cv::Scalar(100),-1); 
     heatmap+=temp; 
    } 
    cv::imshow("Heatmap",heatmap); 
    cv::waitKey(); 

결과 :

enter image description here

+0

만약 내가 그것을 functinonize하고 싶습니까? –

+0

글쎄, 생각해 보라. 이것은 사소한 질문이다. 아주 기본적인 것들 (함수와 클래스). – William

+0

히트 맵에 색상을 추가하려면 어떻게해야합니까? –

2

을 공식 OpenCV의 문서에서 (here 확인) "할 줄 두께CV_FILLED과 같은 음수 값은 함수가 채워진 사각형을 그려야 함을 의미합니다. " 코드에서이 줄을 사용

rectangle(image, pt1, pt2, color, -1, 8, 0); 

UPDATE,

for(int i=0; i < rect.size(); i++) 
      for(int y = rect[i].y; y < rect[i].y + rect[i].height; y++) 
       for(int x = rect[i].x; x < rect[i].x + rect[i].width; x++) 
       { 
        image.at<uchar>(y,x) = 
          saturate_cast<uchar>(image.at<uchar>(y,x) + 50); 
       } 

다음은 각 Rect (50)에 의해 강도를 증가시키고, 그것을 것 -

그래서 두께를 같은 음의 값을 제공 255에 도달하면 255로 유지됩니다.

입력 이미지 중복

enter image description here

출력 이미지

enter image description here

2 RECT

enter image description here

+0

가 참으로이 옵션입니다. 그러나 내가하고 싶은 정확한 작업은 사각형을위한 히트 맵을 작성하여 중첩 된 경계 상자가 단순한 중첩되지 않은 사각형보다 높은 값을 갖도록하는 것입니다. –

+0

"높은 가치"는 어떻게 계산합니까? 이미지에 붙여 넣기를 원하거나 계산하고 싶은'Rect' 크기의'Mat' 객체가 이미 있습니까? – bikz05

+0

두 개의 중첩 된 경계 상자가있는 경우 첫 번째 그림에 회색 값 50과 같은 회색 값을 넣고 두 번째로 큰 사각형에 회색 값 50을 추가하여 중첩되지 않은 영역보다 흰색이 덜어 지도록합니다. 기본적으로 여러 분류자를 얻었고 분류 자 ​​결정이 겹치는 위치를 찾고 싶습니다. –

1

를 그냥 코드에 약간의 수정이 작동합니다 :

static void draw_rectangles(Mat image, vector<Rect> faces) { 

cv::Mat heatmap(image.rows, image.cols, CV_8U,cv::Scalar(0)); 

for(int i = 0; i < faces.size(); i++) 
{ 
    cv::Mat temp = heatmat(faces[i]); // gives you a submatrix of your heatmap pointing at the location of your rectangle 
    temp += 10; // add 10 grey levels to the existing values. This also modifies heatmap as side-effect 
} 
imshow("heatmap", heatmap); 
waitKey(0); 
+0

히트 맵에 색상을 추가하려면 어떻게해야합니까? –

+1

조회 테이블 ['cv :: lut'] 사용 (http://docs.opencv.org/modules/core/doc/operations_on_arrays.html?highlight=lut#cv.LUT) – remi

+0

댓글을 명확하게 할 수 있습니까? ? –

관련 문제