一、计算距离
double getDist(cv::Point p1, cv::Point p2)
{
double r = sqrt((double)((p1.x - p2.x) * (p1.x - p2.x) +
(p1.y - p2.y) * (p1.y - p2.y)));
return r;
}
double getDistX(cv::Point p1, cv::Point p2)
{
double r = abs(p1.x - p2.x);
return r;
}
double getDistY(cv::Point p1, cv::Point p2)
{
double r = abs(p1.y - p2.y);
return r;
}
二、IplImage和Mat类型相互转换
Mat转为IplImage:
Mat gray_image;
IplImage* image;
image=&IplImage(gray_image);
IplImage转为Mat:
IplImage* pImg = cvLoadImage("***.jpg");
cv::Mat img(pImg,0);
三、图片显示
imshow( "img", img ); //Mat
cvWaitKey(1);
cvShowImage( "image", image ); //IplImage
cvWaitKey(1);
四、参数类型
CvMat矩阵
参数类型CV_8UC1,CV_8UC2,CV_8UC3
(1、2、3表示通道数)
float 是32位 >> CvMat数据结构参数:CV_32FC1,CV_32FC2,CV_32FC3
double是64bits >> CvMat数据结构参数:CV_64FC1,CV_64FC2,CV_64FC3
变换这种矩阵单位类型,Mat个函数convertTo:
void Mat::convertTo(OutputArray m, int rtype, double alpha=1, double beta=0 );
rtype :单位类型
cv::Mat image_YUV(image_in_BGR.rows,image_in_BGR.cols,CV_8UC1,cv::Scalar(0,0,0));
cvtColor(image_in_BGR, image_YUV, CV_BGR2YUV, 0 );
cv::Mat image_YUV(image_in_1.rows,image_in_1.cols,CV_8UC1,cv::Scalar(0,0,0));
imshow( "image_in_1", image_in_1 ); //Mat
cvWaitKey(1);
cvtColor(image_in_1, image_YUV, CV_BGR2YUV, 0 );
cv::Mat image_BGR(image_in_1.rows,image_in_1.cols,CV_8UC1,cv::Scalar(0,0,0));
cvtColor(image_YUV, image_BGR, CV_YUV2BGR, 0 );
imshow( "image_BGR", image_BGR ); //Mat
cvWaitKey(1);
五、Mat - 基本图像容器
新版本opencv新的图像数据结构: Mat - 基本图像容器 ,取代旧的 CvMat 和 IplImage 。
使用时,你仅需要包含用到的头文件,比如:
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
在名称之前冠以 cv:: ,或者在包含头文件后,加上以下指令:
using namespace cv; // 新的C++接口API都在此名字空间中,需要导入
六、Mat拷贝
1、浅拷贝:
Mat B;
B = image // 第一种方式
Mat C(image); // 第二种方式
这两种方式称为浅copy,是由于它们有不同的矩阵头,但是它们共享内存空间,即指向一个矩阵。当图像矩阵发生变化时,两者相关联,都会变化。
2、深拷贝
Mat B,C;
B = image.clone(); // 第一种方式
image.copyTo(C); // 第二种方式
深拷贝是真正的copy了一个新的图像矩阵,此时image,B,C三者相互没有影响。
七、Opencv显示图片单通道
分离颜色通道
多通道图像混合
vector<Mat> Channels;
Mat img_B_Ch;
Mat img_G_Ch;
Mat img_R_Ch;
split(image_in_1,Channels); //分离色彩通道
img_B_Ch = Channels.at(0);
imshow( "img_B_Ch", img_B_Ch ); //Mat
cvWaitKey(1);
img_G_Ch = Channels.at(1);
imshow( "img_G_Ch", img_G_Ch ); //Mat
cvWaitKey(1);
img_R_Ch = Channels.at(2);
imshow( "img_R_Ch", img_R_Ch ); //Mat
cvWaitKey(1);
//merge(Channels,image_in_1); //合并色彩通道