OpenCV使用==Memory Storage== 来统一管理各种动态对象的内存
使用==sequence==处理轮廓,是Memory Storage中可存储的一种对象
在OpenCV中的数据结构为FileStorage,打开操作例如:
string filename = "I.xml";
FileStorage fs(filename, FileStorage::WRITE);
\\...
fs.open(filename, FileStorage::READ);
void Histget(const Mat src)
{
vector rgb_planes;
split(src, rgb_planes);
/// 设定bin数目
int histSize = 255;
vector hsv_planes;
/// 设定取值范围 ( R,G,B) )
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));
/// 将直方图归一化到范围 [ 0, histImage.rows ]
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);
}
void resize(Mat inputImg,Mat outputImg,Size dsize,
double fx,double fy,
int interpolation=, CV_INTER_AREA);
//其中 dsize可以通过Size来定义
// Size dsize=Size(Img.rows,Img.cols*2);
//fx,fy与dsize不能同时为0,
//interpolation控制新增像素
//INTER_NEAREST - 最近邻插值
//INTER_LINEAR - 线性插值(默认值)
//INTER_AREA - 区域插值(利用像素区域关系的重采样插值)
//INTER_CUBIC –三次样条插值(超过4×4像素邻域内的双三次插值)
//INTER_LANCZOS4 -Lanczos插值(超过8×8像素邻域的Lanczos插值)
分为pyrUp(向上采样)和pyrDown(向下采样),二者不互逆
void pyrUp(InputMat src, OutputMat dst, Size dsize,
int borderType=BORDER_DEFAULT )
resize可以一次性将原图像变为任意不为0的尺寸,适合用来做归一化图像操作;而pyrDown与pyrUp适合做长宽比率不变得操作,且调用一次只能变为1/2或者2倍~~~
可以参考CSDN链接讲解
void findContours();//得到轮廓区域的参数
步骤:
1. 提取图像,并进行canny边缘提取
2. 进行灰度转换,再经过hough变换
3. 输出hough图像
vector lines;
Houghlines();
Houghcircles();
Mat element=getStructuringElement(MORPH_RECT, Size(5, 5));
//矩形: MORPH_RECT
//交叉形: MORPH_CROSS
//椭圆形: MORPH_ELLIPSE
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(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;