头文件介绍
导图
管理态对象内存、处理轮廓
OpenCV使用==Memory Storage== 来统一管理各种动态对象的内存
使用==sequence==处理轮廓,是Memory Storage中可存储的一种对象
XML\YAML文件打开
在OpenCV中的数据结构为FileStorage,打开操作例如:
string filename =
"I.xml";
FileStorage fs(filename, FileStorage::WRITE);
\\
...
fs.open(filename, FileStorage::READ);
直方图显示
void Histget(
const Mat src)
{
vector<Mat> rgb_planes;
split(src, rgb_planes);
int histSize =
255;
vector<Mat> hsv_planes;
float range[] = {
0,
255 };
const float* histRange = { range };
bool uniform =
true;
bool accumulate =
false;
Mat r_hist, g_hist, b_hist;
calcHist(&rgb_planes[
0],
1,
0, Mat(), r_hist,
1, &histSize, &histRange, uniform, accumulate);
calcHist(&rgb_planes[
1],
1,
0, Mat(), g_hist,
1, &histSize, &histRange, uniform, accumulate);
calcHist(&rgb_planes[
2],
1,
0, Mat(), b_hist,
1, &histSize, &histRange, uniform, accumulate);
int hist_w =
400;
int hist_h =
400;
int bin_w = cvRound((
double)hist_w / histSize);
Mat histImage(hist_w, hist_h, CV_8UC3, Scalar(
0,
0,
0));
normalize(r_hist, r_hist,
0, histImage.rows, NORM_MINMAX, -
1, Mat());
normalize(g_hist, g_hist,
0, histImage.rows, NORM_MINMAX, -
1, Mat());
normalize(b_hist, b_hist,
0, histImage.rows, NORM_MINMAX, -
1, Mat());
for (
int i =
1; i < histSize; i++)
{
line(histImage, Point(bin_w*(i -
1), hist_h - cvRound(r_hist.at<
float>(i -
1))),
Point(bin_w*(i), hist_h - cvRound(r_hist.at<
float>(i))),
Scalar(
0,
0,
255),
2,
8,
0);
line(histImage, Point(bin_w*(i -
1), hist_h - cvRound(g_hist.at<
float>(i -
1))),
Point(bin_w*(i), hist_h - cvRound(g_hist.at<
float>(i))),
Scalar(
0,
255,
0),
2,
8,
0);
line(histImage, Point(bin_w*(i -
1), hist_h - cvRound(b_hist.at<
float>(i -
1))),
Point(bin_w*(i), hist_h - cvRound(b_hist.at<
float>(i))),
Scalar(
255,
0,
0),
2,
8,
0);
}
namedWindow(
"calcHist Demo", CV_WINDOW_AUTOSIZE);
imshow(
"calcHist Demo", histImage);
}
图像尺寸变换
resize 常规方法
void resize(Mat inputImg,Mat outputImg,Size dsize,
double fx,
double fy,
int interpolation=, CV_INTER_AREA);
图像金字塔
分为pyrUp(向上采样)和pyrDown(向下采样),二者不互逆
void pyrUp(InputMat src, OutputMat dst, Size dsize,
int borderType=BORDER_DEFAULT )
resize可以一次性将原图像变为任意不为0的尺寸,适合用来做归一化图像操作;而pyrDown与pyrUp适合做长宽比率不变得操作,且调用一次只能变为1/2或者2倍~~~
可以参考链接讲解
图像结构形状描述
void findContours();
在二值图中快速准确得出直线和圆 分为两种:
标准hough变换统计hough变换
步骤: 1. 提取图像,并进行canny边缘提取 2. 进行灰度转换,再经过hough变换 3. 输出hough图像
vector<Vec2f> lines;
Houghlines();
Houghcircles();
腐蚀、膨胀
膨胀
腐蚀
Mat element
=getStructuringElement(MORPH_RECT, Size(
5,
5));
void cv
::dilate(src,src1,element);
void cv
::erode(src,src1,element);
访问像素
例如产生随机椒盐噪声
i=
std::rand()%img.cols;
j=
std::rand()%img.rows;
if (img.type()==
CV_8UC1)
img.at<uchar>(
I,j)=
255;
//二值图访问
else if (img.type()==
CV_8UC3)
Img.at<
cv::vec3b>(
I,j)[
1]=
255;
//三通道图片访问
Img.at<
cv::vec3b>(
I,j)[
2]=
255;
Img.at<
cv::vec3b>(
I,j)[
3]=
255;