2017-05-11 7 views
1

저는 ROS 주제로 인쇄하기 전에 cv::Mat을 처리하기 위해 C++에서 OpenCV를 사용하고 있습니다. 어떤 이유에서인지 cv::drawKeypoints은 이미지 프레임 너머의 너비로 사실상 스트레칭하여 결과를 망칠 것입니다 : example. 오른쪽 토픽의 얼룩은 왼쪽 토픽 왼쪽 상단에있는 얼룩을 나타냅니다. 모두 cv::Mat가 동일하게 취급됩니다cv :: drawKeypoints가 내 이미지의 크기를 조정하는 이유는 무엇입니까?

image_transport::Publisher pubthresh; 
image_transport::Publisher pubkps; 
cv::SimpleBlobDetector detector; 
void imageCallback(const sensor_msgs::ImageConstPtr& msg) 
{ 
    cv::Mat mat = cv_bridge::toCvShare(msg, "bgr8")->image; 
    cv::cvtColor(mat,mat, CV_BGR2GRAY); 
    cv::threshold(mat,mat,35,255,0); 
    std::vector<cv::KeyPoint> keypoints; 
    detector.detect(mat, keypoints); 
    cv::Mat kps; 
    cv::drawKeypoints(mat, keypoints, kps, cv::Scalar(0,0,255), cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS); 
    sensor_msgs::ImageConstPtr ithresh,ikps; 
    ithresh = cv_bridge::CvImage(std_msgs::Header(), "mono8", mat).toImageMsg(); 
    ikps = cv_bridge::CvImage(std_msgs::Header(), "mono8", kps).toImageMsg(); 
    pubthresh.publish(ithresh); 
    pubkps.publish(ikps); 
} 
int main(int argc, char **argv) 
{ 
    ... 
    image_transport::Subscriber sub = it.subscribe("/saliency_map", 1, imageCallback); 
    ... 
} 

cv::drawKeypoints 수술 후 :

여기 내 코드입니다. 문서에 따르면 이미지의 크기가 조정되지 않아야합니다. 내가 여기서 무엇을 놓치고 있니?

답변

1

결과 이미지는 회색조가 아니고 컬러 이미지처럼 보입니다. 여기에서 늘이기 란 회색조 값으로 해석되는 3 개의 채널이 있기 때문에 각 픽셀이 암시 적으로 가로 방향 크기의 3 배가된다는 것을 의미합니다.

게시 내용을 사용하기 전에 kps을 회색 음영으로 변환 해보세요.

cv::cvtColor(kps,kps, CV_BGR2GRAY); 

또는 대신 "mono8"의 BGR 컬러 이미지를 게시 할 줄

ikps = cv_bridge::CvImage(std_msgs::Header(), "mono8", kps).toImageMsg(); 

을 조정합니다. 하지만 그 코드를 어떻게 사용하는지 모르겠습니다.

+1

그래, 그게 다야! 감사! – user4457190