Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么cv::drawKeypoints会调整图像大小? 我在C++中使用OpenCV处理一个:c::MAT,然后将它打印到ROS主题。出于某种原因,cv::drawKeypoints几乎将结果拉伸到图像帧之外的宽度,从而将结果弄糟了: . 右侧主题中的blob表示左侧主题中左上角的blob_C++_Opencv_Ros - Fatal编程技术网

为什么cv::drawKeypoints会调整图像大小? 我在C++中使用OpenCV处理一个:c::MAT,然后将它打印到ROS主题。出于某种原因,cv::drawKeypoints几乎将结果拉伸到图像帧之外的宽度,从而将结果弄糟了: . 右侧主题中的blob表示左侧主题中左上角的blob

为什么cv::drawKeypoints会调整图像大小? 我在C++中使用OpenCV处理一个:c::MAT,然后将它打印到ROS主题。出于某种原因,cv::drawKeypoints几乎将结果拉伸到图像帧之外的宽度,从而将结果弄糟了: . 右侧主题中的blob表示左侧主题中左上角的blob,c++,opencv,ros,C++,Opencv,Ros,这是我的密码: 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::cvt

这是我的密码:

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);
  ...
}
image\u transport::Publisher-pubsthresh;
图像传输::Publisher pubkps;
cv::SimpleBlob检测器;
无效imageCallback(常量传感器\u msgs::ImageConstPtr&msg)
{
cv::Mat Mat=cv_bridge::toCvShare(msg,“bgr8”)->图像;
cv::CVT颜色(毡、毡、cv_bgr2灰色);
cv::阈值(mat,mat,35255,0);
向量关键点;
检测器。检测(垫、关键点);
cv::Mat kps;
cv::drawKeypoints(mat、keypoints、kps、cv::Scalar(0,0255)、cv::DrawMatchesFlags::DRAW\u RICH\u keypoints);
传感器:ImageConstPtr ithresh,ikps;
ithresh=cv_bridge::CvImage(std_msgs::Header(),“mono8”,mat).toImageMsg();
ikps=cv_bridge::CvImage(std_msgs::Header(),“mono8”,kps).toImageMsg();
发布(ithresh);
发布(ikps);
}
int main(int argc,字符**argv)
{
...
image\u transport::Subscriber sub=it.subscribe(“/salicence\u map”,1,imageCallback);
...
}

在执行
cv::drawKeypoints
操作后,两个
cv::Mat
将被视为相同的对象。根据文档,图像也不应该调整大小。我错过了什么

看起来您的结果图像不是灰度图像,而是彩色图像。 这里的拉伸意味着,每个像素在水平方向上隐式变为3倍大小,因为有3个通道,它们被解释为灰度值

因此,在使用发布工具之前,请尝试将
kps
转换为灰度

cv::cvtColor(kps,kps, CV_BGR2GRAY );
或者调整线路

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

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

是的,就是这样!谢谢