1. 程式人生 > >分割雙目攝像頭同步幀的影象,校正為使用做好準備.

分割雙目攝像頭同步幀的影象,校正為使用做好準備.

淘到一個雙目攝像頭,輸出是左右鏡頭合到一起的影象.
最大2560*[email protected]
pixel format mjpeg



接入ros下執行有資訊提示:

deprecated pixel format used, make sure you did set range correctly
使用了否決的畫素格式,確認設定了範圍?


看了這篇
http://www.ffmpeg-archive.org/MJPEG-Deprecated-pixel-format-warning-td4663994.html

警告主要是針對庫使用者的,ffmpeg的使用者應該不會受到影響。
不知ros下使用會不會受影響,先忽略之.




問題:
攝像頭校正需要左右影象分別輸入.
需想辦法把影象切分,釋出到兩個主題上去.

解決:
檢視攝像頭驅動原始碼是把cv::Mat轉成影象訊息然後釋出到相應主題.

影象訊息和cv::Mat相互轉換.

void publish_test_img(){
    cv::Mat image = cv::imread("/home/zzz/20170415095236604.png", CV_LOAD_IMAGE_COLOR);
    if(image.empty()){
     printf("open error\n");
    }else{
    msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", image).toImageMsg();
    pub_left.publish(msg);
    ros::spinOnce();
    }
  }



訂閱ros影象主題,轉換為opencv 的 cv::Mat
http://blog.csdn.net/robogreen/article/details/50488215

 void convert_callback(const sensor_msgs::ImageConstPtr& msg)
  {
    cv_bridge::CvImagePtr cv_ptr; // 宣告一個CvImage指標的例項

    try
    {
        cv_ptr =  cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8); //將ROS訊息中的圖象資訊提取,生成新cv型別的圖象,複製給CvImage指標
    }
    catch(cv_bridge::Exception& e)  //異常處理
    {
        ROS_ERROR("cv_bridge exception: %s", e.what());
        return;
    }

    image_process(cv_ptr->image); //得到了cv::Mat型別的圖象,在CvImage指標的image中,將結果傳送給處理函式
  }



opencv 裁剪
http://blog.csdn.net/u013896242/article/details/52769943

  cv::Mat image_split(cv::Mat img,CvRect rect){
    // 獲取影象
    int crop_x1 = cv::max(0,rect.x);
    int crop_y1 = cv::max(0,rect.y);
    int crop_x2 = cv::min(img.cols - 1, rect.x + rect.width - 1); // 影象範圍 0到cols-1, 0到rows-1
    int crop_y2 = cv::min(img.rows - 1, rect.y + rect.height - 1);

    return img(cv::Range(crop_y1,crop_y2 + 1),cv::Range(crop_x1,crop_x2 + 1));// 左包含,右不包含

  }


校正效果圖:



launch

<launch>
<node name="imgpub" pkg="zzz_opencv_test" type="rosopencv" output="screen">
<remap from="/camera/image_raw" to="/usb_cam/image_raw"/>
</node>
<node  name="cameracalibrator"
      pkg="camera_calibration" type="cameracalibrator.py"
      args="--size 8x6 --square 0.028778" output="screen">
  <remap from="left" to="camera/image/lefteye"/>
  <remap from="right" to="camera/image/righteye"/>

  <remap from="left_camera" to="usb_cam"/>
  <remap from="right_camera" to="usb_cam"/>

</node>
<!--
<node name="rviz"  pkg="rviz" type="rviz" respawn="false"
       output="screen">
</node>
-->
</launch>


彙總原始碼:

#include <ros/ros.h>
#include <image_transport/image_transport.h>
//#include <opencv2/highgui/highgui.hpp>
#include <cv_bridge/cv_bridge.h>

#include <stdio.h>



//OpenCV2標準標頭檔案
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
static const std::string INPUT = "Input"; //定義輸入視窗名稱
static const std::string OUTPUT_LEFT = "OUTPUT_LEFT"; //定義輸出視窗名稱
static const std::string OUTPUT_RIGHT = "OUTPUT_RIGHT"; //定義輸出視窗名稱
class shuangmu2LeftRight
{
private:
  ros::NodeHandle nh; //定義ROS控制代碼
  sensor_msgs::ImagePtr msg ;
  image_transport::ImageTransport it;
  image_transport::Publisher pub_left;
  image_transport::Publisher pub_right;
  image_transport::Subscriber shuangmu_image_sub_;//定義ROS圖象接收器
public:
  shuangmu2LeftRight()
  :it(nh) //建構函式
  {

    pub_left = it.advertise("camera/image/lefteye", 1);
    pub_right = it.advertise("camera/image/righteye", 1);
    shuangmu_image_sub_ = it.subscribe("camera/image_raw", 1, &shuangmu2LeftRight::convert_callback,this);

    //初始化輸入輸出視窗
    cv::namedWindow(INPUT);
    cv::namedWindow(OUTPUT_LEFT);
    cv::namedWindow(OUTPUT_RIGHT);
    publish_test_img();
  }
  ~shuangmu2LeftRight() //解構函式
  {
    cv::destroyWindow(INPUT);
    cv::destroyWindow(OUTPUT_LEFT);
    cv::destroyWindow(OUTPUT_RIGHT);
  }
  void publish_test_img(){
    cv::Mat image = cv::imread("/home/zzz/20170415095236604.png", CV_LOAD_IMAGE_COLOR);
    if(image.empty()){
     printf("open error\n");
    }else{
    msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", image).toImageMsg();
    pub_left.publish(msg);
    ros::spinOnce();
    }
  }

  /*
        這是一個ROS和OpenCV的格式轉換回調函式,將圖象格式從sensor_msgs/Image  --->  cv::Mat
      */
  void convert_callback(const sensor_msgs::ImageConstPtr& msg)
  {
    cv_bridge::CvImagePtr cv_ptr; // 宣告一個CvImage指標的例項

    try
    {
        cv_ptr =  cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8); //將ROS訊息中的圖象資訊提取,生成新cv型別的圖象,複製給CvImage指標
    }
    catch(cv_bridge::Exception& e)  //異常處理
    {
        ROS_ERROR("cv_bridge exception: %s", e.what());
        return;
    }

    image_process(cv_ptr->image); //得到了cv::Mat型別的圖象,在CvImage指標的image中,將結果傳送給處理函式
  }

  cv::Mat image_split(cv::Mat img,CvRect rect){
    // 獲取影象
    int crop_x1 = cv::max(0,rect.x);
    int crop_y1 = cv::max(0,rect.y);
    int crop_x2 = cv::min(img.cols - 1, rect.x + rect.width - 1); // 影象範圍 0到cols-1, 0到rows-1
    int crop_y2 = cv::min(img.rows - 1, rect.y + rect.height - 1);

    return img(cv::Range(crop_y1,crop_y2 + 1),cv::Range(crop_x1,crop_x2 + 1));// 左包含,右不包含

  }
  void image_process(cv::Mat img)
  {

    CvRect rect;

    rect.x        = 0;
    rect.y        = 0;
    rect.width    = img.cols/2;
    rect.height = img.rows;

    //cv::Mat I = cv::Mat::zeros(rect.height, rect.width, 0);// 目標影象
    cv::Mat roi_img=image_split(img,rect);
    msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", roi_img).toImageMsg();
    pub_left.publish(msg);
    cv::imshow(INPUT, img);
    cv::imshow(OUTPUT_LEFT, roi_img);
    rect.x        = img.cols/2;
    roi_img=image_split(img,rect);
    msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", roi_img).toImageMsg();
    pub_right.publish(msg);
    cv::imshow(OUTPUT_RIGHT, roi_img);
    cv::waitKey(5);

  }
};

int main(int argc, char** argv)
{
  //初始化節點
  ros::init(argc, argv, "rosopencv");
  shuangmu2LeftRight obj;
  ros::spin();

}


相關推薦

分割雙目攝像頭同步影象,校正使用做好準備.

淘到一個雙目攝像頭,輸出是左右鏡頭合到一起的影象. 最大2560*[email protected] pixel format mjpeg 接入ros下執行有資訊提示: deprecated pixel format used, make sure you

OpenCV讀雙目攝像頭合併影象分割

買了個usb介面的雙目攝像頭,首先讀出影象,發現讀出來的影象是合併的,將整個影象分割為左右影象,並且實時顯示. #include <stdio.h> #include <opencv2/opencv.hpp> #include<unistd.h>

開啟雙目攝像頭,連續擷取並分割左右畫面進行儲存

#include <iostream> #include <opencv2/opencv.hpp> #include <fstream> #include <stdio.h> using namespace std

影象語義分割(12)-重新思考空洞卷積: 弱監督和半監督語義分割設計的簡捷方法

論文地址 :Revisiting Dilated Convolution: A Simple Approach for Weakly- and Semi- Supervised Semantic Segmentation 1. 摘要   儘管弱監督分割方法的精度有所提升,但是和全

雙目視覺系統 影象校正

雙目視覺系統影象校正程式碼 //s_intrinsic_matrixL 左相機內參矩陣 //s_distortion_coeffsL 左相機係數 //s_intrinsic_matrixR 右相機

關於YUV視訊的讀取、播放,儲存圖片、以及處理的影象儲存YUV視訊。

下面結合程式碼,總結一下這兩天掌握的內容。下面程式碼的功能,就是讀取YUV視訊指定幀的Y、U、V分量的值。通過這篇文章,會加深大家對YUV視訊如何儲存,以及MATLAB中檔案讀取功能的理解。 首先,讀入YUV視訊 function [Y,U,V]=yuv_import(f

opencv開啟雙目攝像頭影象切割儲存

#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <

C# 捕獲攝像頭的每一影象

public void CaptureVideo() { int hr = 0; IBaseFilter sourceFilter = null; try { // Get DirectShow in

【跟我一起學Unity3D】代碼中分割圖片而且載入序列動畫

stream textfield 控制 調整 我們 pos apply fonts 一個 在Cocos2dx中。對大圖的處理已經封裝好了一套自己的API,可是在Unity3D中貌似沒有類似的API(好吧,實際上是有的,並且功能更強大),或

C#把影象處理正方形影象

摘要: 在C#的winform平臺上利用基於GDI底層圖形引擎(WPF是DirectX圖形引擎,效率更高,該程式碼再WPF上不適用)的操作進行影象的大小處理,轉化為自定義畫素的正方形影象。 一 基本介面及程式碼 1.圖形介面 2.介面程式碼 using System;

基於雙目攝像頭的障礙物檢測

基於雙目攝像頭的障礙物檢測 前言:關於雙目攝像頭的障礙物檢測以及基於OpenCV的障礙物檢測在CSDN以及部落格園上都有幾篇相關的文章。然而,相當一部分的關於障礙物檢測的文章多偏向於理論,而有實踐的文章卻少之又少。在這裡,我將按照我從網上學習到的例子進行整合並加入了我自己的理解。希望能為大家在障礙物檢

SQL Server 分割字串和合並多條資料一行

分割字串函式create function f_split(@c varchar(2000),@split varchar(2)) returns @t table(col varchar(20)) as begin while(charindex(@split,@c)<&g

影象校正—透視變換

透視變換通過投影的方式,把當前影象對映到另外一個平面,就像電影院裡的交代放映機,如果幕布或者膠帶其中任意一個與放映機發出的光纖不是垂直90度角的,那麼投影到幕布上的影象就會發生畸變。這種畸變就是透視畸變的一種。 透視變換對畸變影象的校正需要取得

在python中使用opencv將RGB影象轉換HSV及YCrCb影象(附程式碼)

【時間】2018.11.01 【題目】在python中使用opencv將RGB影象轉換為HSV及YCrCb影象(附程式碼) 目錄 概述 一、程式碼實現 二、執行結果 三、關於HSV及YCrCb的一點補充 3.1HSV顏色空間 3.2 YCRCBA顏色空間

關於PET重建影象匯出DICOM格式資料出現負值現象

簡述   最近做PET重建影象資料匯出為DICOM3.0格式資料時,匯出後的資料使用Amide和PMOD載入檢視,總是出現一半負值一半正值現象(原始值為正值),百思不得其解。詳細檢視DICOM標準後發現實Tag為(0028,0103)的Pixel Representation引數值本應為0,卻被設定為1了。

Elasticsearch + head + 資料庫同步資料(本例子mysql)

希望通過這篇文章,減少你的時間,願同你一起修行,任重而道遠! 先來看看最終效果: 第一.安裝:Elasticsearch 安裝之前檢查***jdk***是否安裝: cmd 輸入命令 java -version 2.

android獲取攝像頭視訊資料

1.思路 一.通過android的Camera.setPreviewCallback(PreviewCallback cb)監聽回撥. 二.此回撥函式public void onPreviewFrame(byte[] data, Camera camera)每回調一次就是

opencv、c++、Qt連續擷取雙目攝像頭畫面

雙目標定前,嘗試獲取雙目相機的影象,但是所得影象是兩個攝像頭的畫面相連而成的。 #include <iostream> #include <opencv2/opencv.hpp> #include <fstream> #inc

asciiviewer - 將影象轉換ASCII藝術

由於終端僅限於文字,因此像asciiviewer這樣的工具通常可用於從純文字生成影象。 要做到這一點,你需要一個名為asciiviewer的工具。 aview/asciiview是一個影象檢視器,以ASCII藝術顯示影象... aview支援縮放/退出,三種抖動模式,反轉,對比度,亮度,伽馬控制,並可以儲

雙目攝像頭標定完整過程 VS2015+Opencv3.0

運用matlab2017 進行攝像頭獲取標定引數: 本人試過兩種方法,好壞各有。 ①運用matlab自帶標定工具箱進行標定,非常省事,說下大概步驟,(嫌麻煩不上圖了) 1.在命令列輸入stereoCameraCalibrator  等待彈出介面   2.然後將上面的S