修改摄像头分辨率并发布Topic
来源:互联网 发布:淘宝买家改差评 编辑:程序博客网 时间:2024/06/11 19:41
最近买了个1280x960的黑白摄像头,默认输出640x480,需要调节摄像头参数。
最终代码:
#include <iostream>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/features2d/features2d.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/calib3d/calib3d.hpp>#include <opencv2/nonfree/nonfree.hpp>#include <sensor_msgs/Image.h>#include <sensor_msgs/image_encodings.h>#include <cv_bridge/cv_bridge.h>#include <ros/ros.h>#include <image_transport/image_transport.h>using namespace std;using namespace cv;int main(int argc, char** argv){ sensor_msgs::ImagePtr img_msg; // >> message to be sent cv::Mat frame; ros::init(argc, argv, "cam"); ros::NodeHandle nh; int32_t device_id(0); int32_t image_width(1280); int32_t image_height(960); nh.getParam("device_id",device_id); nh.getParam("image_width",image_width); nh.getParam("image_height",image_height); VideoCapture cap(device_id); // open the default camera if(!cap.isOpened())cout<<"Error open cam!"<<endl; if(!cap.isOpened())return -1;// check if we succeeded cout<<"Camera is open,to topic:cam/image"<<endl; bool bsw,bsh; if(cap.get(CV_CAP_PROP_FRAME_WIDTH)!=image_width) { bsw = cap.set(CV_CAP_PROP_FRAME_WIDTH,image_width); bsh = cap.set(CV_CAP_PROP_FRAME_HEIGHT,image_height); } cout<<"Resolution:"<<cap.get(CV_CAP_PROP_FRAME_WIDTH)<<"x"<<cap.get(CV_CAP_PROP_FRAME_HEIGHT)<<endl; image_transport::ImageTransport it(nh); image_transport::Publisher pub_img = it.advertise("cam/image", 1); ros::Rate rate(50); while(nh.ok()) { cap >> frame; // get a new frame from camera img_msg=cv_bridge::CvImage(std_msgs::Header(), "bgr8", frame).toImageMsg(); pub_img.publish(img_msg); // ros::Publisher pub_img = node.advertise<sensor_msgs::Image>("topic", queuesize); ros::spinOnce(); rate.sleep(); } return 0;}
这里有个问题,就是插上摄像头第一次可以调用set进行写入参数,但是第二次就会报错:
HIGHGUI ERROR: V4L: Initial Capture Error: Unable to load initial memory buffers.
现在还没搞清什么原因,我就才去了一个办法:
if(cap.get(CV_CAP_PROP_FRAME_WIDTH)!=image_width) { bsw = cap.set(CV_CAP_PROP_FRAME_WIDTH,image_width); bsh = cap.set(CV_CAP_PROP_FRAME_HEIGHT,image_height); }
就是一般情况不需要频繁调节分辨率,所以先读取现在的分辨率,如果和想要的一致(插上摄像头第一次运行已经配置好了)就不执行set函数了。
然后是launch文件:
<launch> <param name="device_id" value="0"/> <param name="image_width" value="1280"/> <param name="image_height" value="960"/> <node pkg="demo" type="cam" name="cam" output="screen"> </node></launch>
还没完,标定时发现没发布camera_info信息。待续
0 0
- 修改摄像头分辨率并发布Topic
- openCV中修改摄像头的分辨率
- 通过重新编译Opencv修改摄像头分辨率
- wince6.0+s3c6410摄像头驱动修改 (ov9650预览分辨率设置)
- wince6.0+s3c6410摄像头驱动修改 (分辨率)
- 关于怎样把普通usb摄像头图像发布到ros的topic
- ActiveMQ 发布订阅(Topic)
- opencv 设置摄像头分辨率
- Opencv设置摄像头分辨率
- 像素 屏幕分辨率 摄像头分辨率
- opencv设置摄像头分辨率
- ActiveMQ Topic发布订阅消息
- DirectShow中枚举摄像头分辨率
- OpenCV设置摄像头的分辨率
- Python-OpenCV设置摄像头分辨率
- 使用opencv249设置摄像头分辨率
- OpenCV 设置摄像头输出分辨率
- Python-OpenCV设置摄像头分辨率
- 为什么不能无损反编译?
- 解决svn: Can't convert string from 'UTF-8' to native encoding错误
- jmeter性能测试基本操作
- iOS10--CallKit的简单应用
- gzip,deflate,zlib辨析
- 修改摄像头分辨率并发布Topic
- 项目运行时上下有黑边
- PHP 升级5.6版本后遇到的问题
- Apache Veloctiy模板引擎示例
- 图像特征— —SURF特征
- OpenCv中FileStorage类读写XML文件的示例Demo
- argparse库 学习记录
- ServiceManager 进程启动源码分析
- linux下shell for 循环执行不等待php脚本返回