opencv中的函数drawmatches粗细怎么设置,是哪个参数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv中的函数drawmatches粗细怎么设置,是哪个参数相关的知识,希望对你有一定的参考价值。

void drawMatches(const Mat&img1, const vector<KeyPoint>&keypoints1, const Mat&img2, const vector<KeyPoint>&keypoints2, const vector<DMatch>&matches1to2, Mat&outImg, const Scalar&matchColor=Scalar::all(-1), const Scalar&singlePointColor=Scalar::all(-1), const vector<char>&matchesMask=vector<char>(), intflags=DrawMatchesFlags::DEFAULT)

Parameters:
img1 – 源图像1
keypoints1 –源图像1的特征点.
img2 – 源图像2.
keypoints2 – 源图像2的特征点
matches1to2 – 源图像1的特征点匹配源图像2的特征点[matches[i]] .
outImg – 输出图像具体由flags决定.
matchColor – 匹配的颜色(特征点和连线),若matchColor==Scalar::all(-1),颜色随机.
singlePointColor – 单个点的颜色,即未配对的特征点,若matchColor==Scalar::all(-1),颜色随机.
matchesMask – Mask决定哪些点将被画出,若为空,则画出所有匹配点.
flags – Fdefined by DrawMatchesFlags.

openCV,C++接口,PCA:
PCA是高维数据线性降维的一个常用算法,在openCV的较早版本里面,已经有C版本的集成。在openCV更新的版本发布后,其中集成的PCA算法也有了C++接口。
PCA C++接口的使用,可以参见链接。
视频读取、写入解码器:
openCV 2.3.1 中有一个宏 CV_FOURCC,给定适当的参数,就设置对应的视频解码器,有如下一些选择:
CV_FOURCC('P', 'I', 'M', '1') = MPEG-1 codec
CV_FOURCC('M', 'J', 'P', 'G') = motion-jpeg codec (does not work well)
CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec
CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec
CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec
CV_FOURCC('U', '2', '6', '3') = H263 codec
CV_FOURCC('I', '2', '6', '3') = H263I codec
CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec

cv::VideoCapture的属性:
使用该类的get函数可以获取视频流的属性,具体属性有这些:
'PosMsec' Current position of the video file in milliseconds or video capture timestamp.
'PosFrames' 0-based index of the frame to be decoded/captured next.
'AVIRatio' Relative position of the video file: 0 - start of the film, 1 - end of the film.
'FrameWidth' Width of the frames in the video stream.
'FrameHeight' Height of the frames in the video stream.
'FPS' Frame rate.
'FourCC' 4-character code of codec.
'FrameCount' Number of frames in the video file.
'Format' Format of the Mat objects returned by retrieve() .
'Mode' Backend-specific value indicating the current capture mode.
'Brightness' Brightness of the image (only for cameras).
'Contrast' Contrast of the image (only for cameras).
'Saturation' Saturation of the image (only for cameras).
'Hue' Hue of the image (only for cameras).
'Gain' Gain of the image (only for cameras).
'Exposure' Exposure (only for cameras).
'ConvertRGB' Boolean flags indicating whether images should be converted to RGB.
'Rectification' Rectification flag for stereo cameras (note: only supported by DC1394 v 2.x backend currently)
上述属性在get()中都应该写成 CV_CAP_PROP_POS_AVI_RATIO 的枚举类型的形式。
C++ 接口中的图像特征检测:
常用的图像特征有SIFT、SUFR、Harris等,在OpenCV的C++接口中基本都完成了类封装。
使用openCV C++接口的SIFT特征的一个例子如下:
Mat img_1 = imread( "frame1.tiff", CV_LOAD_IMAGE_GRAYSCALE );
Mat img_2 = imread( "frame2.tiff", CV_LOAD_IMAGE_GRAYSCALE );

if( !img_1.data || !img_2.data )
std::cout<< " --(!) Error reading images " << std::endl; return -1;

SiftFeatureDetector detector;

std::vector<KeyPoint> keypoints_1, keypoints_2;

detector.detect( img_1, keypoints_1 );
detector.detect( img_2, keypoints_2 );

Mat img_keypoints_1; Mat img_keypoints_2;

drawKeypoints( img_1, keypoints_1, img_keypoints_1, Scalar::all(-1), DrawMatchesFlags::DEFAULT );
drawKeypoints( img_2, keypoints_2, img_keypoints_2, Scalar::all(-1), DrawMatchesFlags::DEFAULT );

imshow("Keypoints 1", img_keypoints_1 );
imshow("Keypoints 2", img_keypoints_2 );

waitKey(0);
其实openCV中有一个 FeatureDetector 基类,从中派生出了很多诸如 SiftFeatureDetector、SurfFeatureDetector 的特征类。其使用方法都与上述例子大同小异。
除了提取特征点之外,关于特征点描述子(descriptor)的提取,以及不同图像的特征匹配,openCV也都有封装,具体见下面SIFT的例子:
Mat img_1 = imread( "frame1.tiff", CV_LOAD_IMAGE_GRAYSCALE );
Mat img_2 = imread( "frame2.tiff", CV_LOAD_IMAGE_GRAYSCALE );

if( !img_1.data || !img_2.data )
return -1;

SiftFeatureDetector detector;

std::vector<KeyPoint> keypoints_1, keypoints_2;

detector.detect( img_1, keypoints_1 );
detector.detect( img_2, keypoints_2 );

SiftDescriptorExtractor extractor;

Mat descriptors_1, descriptors_2;

extractor.compute( img_1, keypoints_1, descriptors_1 );
extractor.compute( img_2, keypoints_2, descriptors_2 );

BruteForceMatcher< L2<float> > matcher;
std::vector< DMatch > matches;
matcher.match( descriptors_1, descriptors_2, matches );

Mat img_matches;
drawMatches( img_1, keypoints_1, img_2, keypoints_2, matches, img_matches );

imshow("Matches", img_matches );
waitKey(0);

cv::Mat 重新定义大小,cv::resize:
一个例子是,
cv::resize( tmpImgIn, tmpImgOut, cv::Size(_width,_height) );
openCV解一元三次方程:
cv::solveCubic(const Mat& coeffs, Mat& roots);
openCV解高次方程(多项式方程):
cv::solvePoly
openCV解线性方程组 or 用最小二乘法解线性方程组:
cv::solve(coeff, roots)
注意如果结果是复数,则结果 roots 是多通道的(虚数通道是通道2),一般类型为CV_32FC2
openCV已经封装了输出运算符“<<”对 cv::Mat 的重载,可以直接用cout看结果
一个例子见:
注意coeff中是按从低次(0次)到高次的顺序来存放系数的。
cv::Mat coeff;
cv::Mat roots;
coeff.create(3, 1, CV_32FC1);
coeff.at<float>(0,0) = 4.0;
coeff.at<float>(1,0) = 0.0;
coeff.at<float>(2,0) = 1.0;
cv::solvePoly(coeff, roots);
printf("%d\n", roots.channels());
cout<<roots<<endl;
将 cv::Mat 的所有元素设为一个值:
直接用赋值号即可,例如
cv::Mat m(100, 100, CV_8UC1); //gray
m = cv::Scalar(5); //used only Scalar.val[0]

cv::Mat m(100, 100, CV_8UC3); //3-channel
m = cv::Scalar(5, 10, 15); //Scalar.val[0-3] used

使用 at 函数读取 cv::Mat 的多通道数据:
一个例子为:
cv::Mat roots;
roots.create(2,2,CV_32FC2);
for(int i=0; i<2; i++)
for(int j=0; j<2; j++)
printf("%f %f\n", roots.at<float>(i,j*2+0), // 通道0(i,j)
roots.at<float>(i,j*2+1)); // 通道1(i,j)



矩阵乘法常用函数:
cv::gemm

cv::Size
cv::Size tsize(100,200);
cout<<tsize.width<<" "<<tsize.height<<endl;
输出结果是“100 200”,即先width、后height
参考技术A 根据参数来看,似乎不提供粗细设置,如果想改变粗细,是不是可以通过自己画?本回答被提问者采纳

Pytohn OpenCV 绘图函数

 

 

绘图函数都需要设置一些参数

img:想要绘制图形的那个图像

color:形状的颜色。

thickness:线条的粗细(如果给一个闭合图形设置为-1,那么这个图形会被填充)。默认值是1.

linetype:线条的类型,8连接,抗锯齿等。默认情况是8连接。cv2.LINE_AA为抗锯齿。

 

画线

cv2.line(图像,起点,终点,颜色,线条类型)

# -*- coding: utf-8 -*-

import cv2
import numpy as np

img = np.zeros((512, 512, 3), np.uint8)

#画一条线
cv2.line(img, (0, 0), (511, 511), (255, 0, 0), 5)

cv2.imshow(image, img)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

 

画矩形

cv2.rectangle(图像,左上角顶点,右下角顶点, 颜色,线条类型)

#画一个矩形
cv2.rectangle(img, (384, 0), (510, 128), (0, 255, 0), 3)

 

画圆

cv2.circle(图像, 圆心,半径,颜色,线条类型)

#画一个园
cv2.circle(img, (447, 63), 63, (0, 0, 255), -1)

 

画椭圆

cv2.ellipse(图像,中心点坐标,长轴短轴,逆时针方向旋转角度,顺时针方向起始角度,顺时针方向结束角度,颜色, 线条类型)

#画一个椭圆
cv2.ellipse(img, (256, 256), (100, 50), 0, 0, 180, (255, 0, 0), -1)

 

画多边形

需要指定每个顶点的坐标。

用坐标构造一个数组,行数就是点的数目。

数组的数据类型必须为int32

#画一个多边形
pts = np.array([[10,5], [20,30], [70,20], [50,10]], np.int32)
pts = pts.reshape((-1, 1, 2))
cv2.polylines(img, [pts], True, (0, 255, 255))

如果第三个参数时False,那么多边形是不闭合的(首尾不相接)

 

在图片上添加文字

需要的参数:

要绘制的文字

绘制的位置

字体类型

字体大小

字体的属性(颜色,粗细,线条类型等)

#添加文字
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, OpenCV, (10, 500), font, 4, (255, 255, 255), 2)

 

综合示例

# -*- coding: utf-8 -*-

import cv2
import numpy as np

img = np.zeros((512, 512, 3), np.uint8)

#画一条线
cv2.line(img, (0, 0), (511, 511), (255, 0, 0), 5)

#画一个矩形
cv2.rectangle(img, (384, 0), (510, 128), (0, 255, 0), 3)

#画一个园
cv2.circle(img, (447, 63), 63, (0, 0, 255), -1)

#画一个椭圆
cv2.ellipse(img, (256, 256), (100, 50), 0, 0, 180, (255, 0, 0), -1)


#画一个多边形
pts = np.array([[10,5], [20,30], [70,20], [50,10]], np.int32)
pts = pts.reshape((-1, 1, 2))
cv2.polylines(img, [pts], True, (0, 255, 255))

#添加文字
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, OpenCV, (10, 500), font, 4, (255, 255, 255), 2)

winname = example
cv2.namedWindow(winname)
cv2.imshow(winname, img)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

以上是关于opencv中的函数drawmatches粗细怎么设置,是哪个参数的主要内容,如果未能解决你的问题,请参考以下文章

模块'对象没有属性'drawMatches'opencv python

两幅图像之间的 DrawMatching - 图像识别

r语言怎么调整轴的粗细

Pytohn OpenCV 绘图函数

R语言R原生以及ggplot2设置线条类型宽度(粗细)颜色的函数ggplot2手动自定义设置线条类型粗细颜色函数(line typesthicknesscolour)

openCV在VC6.0中的配置问题