Opencv和ros melodic

Opencv和ros melodic

基本cpp架构

#include "opencv2/opencv.hpp"  
#include  

int main(int argc,char **argv)
{
    ros::init(argc,argv,"opencv_test");
    ros::NodeHandle nh ;
    ROS_INFO_STREAM( " Hello , ␣ opencv_test! " ) ;
    //放置其他任务
    /******例如,播放一个视频**************/
     VideoCapture cap;
    //cap.open(0);   //前置摄像头
    cap.open("/home/alina/my repo/1.MOV");
/*
virtual bool cv::VideoCapture::open	(	const String & 	filename,
int 	apiPreference = CAP_ANY 
)	
return true if the file has been successfully opened
*/
    Mat img;
    namedWindow("ALINA");
    for(;;)
    {
        cap>>img;
        if(img.empty()) break;
        imshow("ALINA",img);
        if(waitKey(33)>=0) break;  //按键中断
    }
    return 0;
    /**************************************/
    
}

Cmakelist.txt

cmake_minimum_required(VERSION 3.0.2)
project(cv_ros_test)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
)
  find_package(OpenCV REQUIRED)

add_executable(opencv_test
  src/opencv_test.cpp
)
add_dependencies(opencv_test ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(opencv_test
  ${catkin_LIBRARIES}
  ${OpenCV_LIBRARIES}
)
//仅列出必需的

运行节点

source devel/setup.bash
rosrun cv_ros_test opencv_test    
//rosrun package_name node_name

查看opencv版本

printf("版本" CV_VERSION);  //有个宏定义变量

关于alpha通道

「Alpha 通道」储存一个值,其外在表现是「透明度」,Alpha 和透明度没啥关系。
为什么取名为 Alpha 通道,是因为这是除RGB以外「第一个通道」的意思,没有别的更深刻的含义。
阿尔法通道(α Channel或Alpha Channel)是指一张图片的透明和半透明度。例如:一个使用每个像素16比特存储的位图,对于图形中的每一个像素而言,可能以5个比特表示红色,5个比特表示绿色,5个比特表示蓝色,最后一个比特是阿尔法。在这种情况下,它要么表示透明要么不是,因为阿尔法比特只有0或1两种不同表示的可能性。又如一个使用32个比特存储的位图,每8个比特表示红绿蓝,和阿尔法通道。在这种情况下,就不光可以表示透明还是不透明,阿尔法通道还可以表示256级的半透明度,因为阿尔法通道有8个比特可以有256种不同的数据表示可能性。
RGBA是代表Red(红色) Green(绿色) Blue(蓝色)和 Alpha的色彩空间。虽然它有的时候被描述为一个颜色空间,但是它其实仅仅是RGB模型的附加了额外的信息。

saturate_cast防止颜色溢出

https://blog.csdn.net/qq_15698613/article/details/84557588

CV_
8U:无符号整型8位
C4:四个信道。
mRgba = new Mat(height, width, CvType.CV_8UC4);

创建具有四种颜色通道和值的范围在0矩阵〜255

imwrite

imwrite()
bool cv::imwrite ( const String & filename,
InputArray img,
const std::vector< int > & params = std::vector< int >()
)

#include 
using namespace cv;
using namespace std;
static void createAlphaMat(Mat &mat)
{
    CV_Assert(mat.channels() == 4);
    for (int i = 0; i < mat.rows; ++i)
    {
        for (int j = 0; j < mat.cols; ++j)
        {
            Vec4b& bgra = mat.at<Vec4b>(i, j);
            bgra[0] = UCHAR_MAX; // Blue
            bgra[1] = saturate_cast<uchar>((float (mat.cols - j)) / ((float)mat.cols) * UCHAR_MAX); // Green
            bgra[2] = saturate_cast<uchar>((float (mat.rows - i)) / ((float)mat.rows) * UCHAR_MAX); // Red
            bgra[3] = saturate_cast<uchar>(0.5 * (bgra[1] + bgra[2])); // Alpha
        }
    }
}
int main()
{
    // Create mat with alpha channel
    Mat mat(480, 640, CV_8UC4);
    createAlphaMat(mat);
    vector<int> compression_params;
    compression_params.push_back(IMWRITE_PNG_COMPRESSION);
    compression_params.push_back(9);
    bool result = false;
    try
    {
        result = imwrite("alpha.png", mat, compression_params);
    }
    catch (const cv::Exception& ex)
    {
        fprintf(stderr, "Exception converting image to PNG format: %s\n", ex.what());
    }
    if (result)
        printf("Saved PNG file with alpha data.\n");
    else
        printf("ERROR: Can't save PNG file.\n");
    return result ? 0 : 1;
}

addweighted

Opencv和ros melodic_第1张图片

        Mat imageROI;       
        imageROI= image(Rect(800,350,logo.cols,logo.rows));
        //或imageROI= image(Range(350,350+logo.rows),Range(800,800+logo.cols));
        addWeighted(imageROI,0.5,logo,0.3,0.,imageROI);

滑动条和鼠标操作

createTrackbar
SetMouseCallback

event
Opencv和ros melodic_第2张图片

rng随机数

Random Number Generator
https://blog.csdn.net/qq_33485434/article/details/78980587

image.copyTo()

https://blog.csdn.net/u013270326/article/details/72730812

Scalar::all(0)

image=Scalar::all(0);  //全部初始化为0

图像Mat类型对象的拷贝、赋值和创建区别

https://blog.csdn.net/weixin_44718794/article/details/109144699

你可能感兴趣的:(opencv学习)