2017-05-11 2 views
1

OpenCVをC++で使用してcv::Matを処理してから、ROSトピックに出力しています。何らかの理由で、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

関連する問題