c++ - 为什么 cv::drawKeypoints 会调整我的图像大小?

标签 c++ opencv ros

我在 C++ 中使用 OpenCV 处理 cv::Mat,然后将其打印到 ROS 主题。出于某种原因,cv::drawKeypoints 实际上将结果拉伸(stretch)到超出图像框架的宽度,从而弄乱了我的结果: example .右侧主题中的 blob 代表左侧主题中左上角的那个。

这是我的代码:

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 操作之后,两个 cv::Mat 被同等对待。根据文档,图像也不应调整大小。我在这里错过了什么?

最佳答案

看起来您的结果图像不是灰度图像而是彩色图像。 这里的拉伸(stretch)意味着,每个像素在水平方向上隐含地变成 3 倍的大小,因为有 3 个 channel ,这被解释为灰度值。

因此,在使用您的发布内容之前,请尝试将 kps 转换为灰度。

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

或者调线

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

发布 bgr 彩色图像而不是“mono8”。但我不知道如何使用该代码。

关于c++ - 为什么 cv::drawKeypoints 会调整我的图像大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43916635/

相关文章:

c++ - 添加和初始化新 std::map 元素的最有效方法是什么?

c++ - 具有多个内循环的循环的时间复杂度

c++ - Opencv 比较图像

c++ - OpenCV:如何使用 5 点算法从来自不同相机的两个图像之间的特征匹配计算基本矩阵?

c++ - opencv函数中的内存泄漏

cmake - 为 ROS 编写 CMakeLists.txt

linux - 一个项目中的不同版本的 yocto

c++ - Ifstream 在打开文件时崩溃程序

c++ - PCL 八叉树 std::bad_alloc C++

c++ - 唐叶 C++ 实现