ROS_OpenCV_socket传送图像_结果不对
来源:互联网 发布:中医体质测试软件 编辑:程序博客网 时间:2024/05/16 13:58
//Includes all the headers necessary to use the most common public pieces of the ROS system.#include <ros/ros.h>//Use image_transport for publishing and subscribing to images in ROS#include <image_transport/image_transport.h>//Use cv_bridge to convert between ROS and OpenCV Image formats#include <cv_bridge/cv_bridge.h>#include <sensor_msgs/image_encodings.h>//Include headers for OpenCV Image processing#include <opencv2/imgproc/imgproc.hpp>//Include headers for OpenCV GUI handling#include <opencv2/highgui/highgui.hpp>#include<string> #include <sstream>#include <std_msgs/UInt8.h>#include <sys/types.h>#include <sys/socket.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/ioctl.h>#include <unistd.h>#include <netdb.h>#include <netinet/in.h> #include <arpa/inet.h> using namespace cv;using namespace std;//Store all constants for image encodings in the enc namespace to be used later. namespace enc = sensor_msgs::image_encodings; void image_socket(Mat inImg);Mat image1;static int imgWidth, imgHeight;static ros::Publisher img_numPub;static int image_num = 1;std_msgs::UInt8 image_numP;int socket();#define PORT 30000#define BUFFER_SIZE 30000static int sockfd;static struct sockaddr_in serv_addr;//static ros::Publisher capture; //This function is called everytime a new image_info message is publishedvoid camInfoCallback(const sensor_msgs::CameraInfo & camInfoMsg){ //Store the image width for calculation of angle imgWidth = camInfoMsg.width; imgHeight = camInfoMsg.height;}//This function is called everytime a new image is publishedvoid imageCallback(const sensor_msgs::ImageConstPtr& original_image){ //Convert from the ROS image message to a CvImage suitable for working with OpenCV for processing cv_bridge::CvImagePtr cv_ptr; try { //Always copy, returning a mutable CvImage //OpenCV expects color images to use BGR channel order. cv_ptr = cv_bridge::toCvCopy(original_image, enc::BGR8); } catch (cv_bridge::Exception& e) { //if there is an error during conversion, display it ROS_ERROR("tutorialROSOpenCV::main.cpp::cv_bridge exception: %s", e.what()); return; } image_socket(cv_ptr->image);}void image_socket(Mat inImg){ imshow("image_socket", inImg);//显示图片 if( inImg.empty() ) { ROS_INFO("Camera image empty"); return;//break; } stringstream sss; string strs; char c = (char)waitKey(1); if( c == 27 ) ROS_INFO("Exit boss");//break; switch(c) { case 'p': resize(inImg,image1,Size(imgWidth/6,imgHeight/6),0,0,CV_INTER_LINEAR); image1=image1(Rect(image1.cols/2-32,image1.rows/2-32, 64, 64)); strs="/home/hsn/catkin_ws/src/rosopencv/"; sss.clear(); sss<<strs; sss<<image_num; sss<<".jpg"; sss>>strs; imwrite(strs,image1);//保存图片 image_numP.data=image_num; cout<<image_num<<endl; img_numPub.publish(image_numP); socket(); image_num++; break; default: break; }}int socket(){ int sendbytes; unsigned char buf[BUFFER_SIZE]; FILE *src_file; int real_read_len; memset(buf, 0, sizeof(buf)); //清空发送缓冲器/*以只读方式打开源文件*/char *imgfile = "/home/hsn/catkin_ws/src/rosopencv/"; char strImg[255]; sprintf(strImg, "%s%d.jpg", imgfile, image_num); src_file = fopen(strImg, "r");/* 将源文件的读写指针移到文件的起始位置*/ fseek(src_file, 0, SEEK_SET); /*发送文件给服务器端*/ if(NULL != src_file) { printf("begin\n"); while( !feof( src_file ) )//未到文件末尾,则继续发送 { real_read_len = fread(buf, 1, sizeof(buf), src_file); cout<<real_read_len<<endl; // nNumRead = fread( temp, 1, 256, src_file ); if ((sendbytes = send(sockfd, buf, real_read_len, 0)) < 0) { perror("Send error!\n"); cout<<sendbytes<<endl; exit(1); } bzero(buf, BUFFER_SIZE); } printf("over\n"); fclose( src_file ); // close(sockfd); } return 0;}/*** This is ROS node to track the destination image*/int main(int argc, char **argv){ ros::init(argc, argv, "image_socket"); ROS_INFO("-----------------"); char * servInetAddr = "202.113.25.134"; /*创建socket*/ if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1) { perror("Socket failed!\n"); exit(1); } printf("Socket id = %d\n",sockfd);/*设置sockaddr_in 结构体中相关参数*/ serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); // serv_addr.sin_addr = *((struct in_addr *)host->h_addr); inet_pton(AF_INET, servInetAddr, &serv_addr.sin_addr); bzero(&(serv_addr.sin_zero), 8); /*调用connect 函数主动发起对服务器端的连接*/ if(connect(sockfd,(struct sockaddr *)&serv_addr, sizeof(serv_addr))== -1) { perror("Connect failed!\n"); exit(1); } printf("welcome\n"); ros::NodeHandle nh; image_transport::ImageTransport it(nh); image_transport::Subscriber sub = it.subscribe("camera/rgb/image_raw", 1, imageCallback); ros::Subscriber camInfo = nh.subscribe("camera/rgb/camera_info", 1, camInfoCallback); std_msgs::UInt8 img_numP; img_numPub = nh.advertise<std_msgs::UInt8>("imageNumber", 10); ros::Rate loop_rate(10); while (ros::ok()) { //img_numPub.publish(img_numP); ros::spinOnce(); loop_rate.sleep(); } //img_numP.data = 0; //img_numPub.publish(img_numP); //ros::spin(); close(sockfd); //ROS_INFO is the replacement for printf/cout. ROS_INFO("tutorialROSOpenCV::main.cpp::No error.");return 0;}
能发送数据,但是结果不对。不知道为什么。
0 0
- ROS_OpenCV_socket传送图像_结果不对
- ROS_OpenCV_socket客户端传送图像
- ROS_OpenCV_socket客户端发送kinect图像及接受图像
- 代码的结果输出不对
- C# 输出到txt 结果不对
- 为什么 y<0 时,输出结果不对?
- multisim12 仿真运放结果不对问题解决
- cuda 反傅里叶变换结果不对的问题
- 结构体中变量输入顺序不对会导致执行结果不对
- 图像处理结果
- 图像融合结果评价
- E680I通过蓝牙串口传送图像
- 怎么用XML传送图像数据
- 传奇脚本_传奇传送员脚本
- OpenCV HOG行人检测怎么结果不对呢?
- 第十一周项目五当年有几天(结果不对)
- HasMap中添加List<String>遍历输出结果不对
- ArrayList.contains(obj o)出现返回结果不对的问题
- java.lang.OutOfMemoryError:GC overhead limit exceeded解决方法
- 安卓初学一之布局RelativeLayout和linearlayout
- Android 4.4KK系统关机流程分析
- Masonry
- BouncyCastle产生一个PKCS#12规范的PFX/p12证书【自用笔记】
- ROS_OpenCV_socket传送图像_结果不对
- 机器学习算法-Mean-shift
- unity开发相关环境(vs、MonoDevelop)行结尾符不一致解决办法
- oracle 求两个时间点直接的分钟、小时数
- 游戏中常见的洗牌算法
- SLRequest
- git学习笔记(一)
- UTF-8和GBK互转
- spring巧用继承解决bean的id相同的问题