Opencv和ros melodic
基本cpp架构
#include "opencv2/opencv.hpp"
#include <ros/ros.h>
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 <opencv2/imgcodecs.hpp>
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
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
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