void test() {
Mat src = imread("D:/opencvsp/pic.png");
if (src.empty())
{
printf("could not load image ");
return -1;
}
namedWindow("test opencv setup", WINDOW_AUTOSIZE);
imshow("test opencv setup", src);
namedWindow("output windows", WINDOW_AUTOSIZE);
Mat output_image;
cvtColor(src, output_image, COLOR_BGR2HLS);///
imshow("output windows", output_image);
imwrite("D:/opencvsp/hsls.png", output_image);///
}
//提高对比度 矩阵的掩膜操作
void test02(){
Mat src, dst;
src = imread("D:/opencvsp/pic.png");
if (!src.data)
{
printf("could not load image ");
return -1;
}
namedWindow("intput image", WINDOW_AUTOSIZE);
imshow("input image", src);
int cols = (src.cols - 1) * src.channels();
int offsetx = src.channels();
int rows = src.rows;
dst = Mat::zeros(src.size(),src.type());
for (int row = 0; row < rows - 1; row++)
{
const uchar* previous = src.ptr<uchar>(row - 1);
const uchar* current = src.ptr<uchar>(row);
const uchar* next = src.ptr<uchar>(row + 1);
uchar* output = dst.ptr<uchar>(row);
for (int col = 0; col < cols; col++)
{
output[col] = saturate_cast<uchar>(5 * current[col] - (current[col - offsetx] + current[col + offsetx] + previous[col] + next[col]));
}
}
Mat kernel = (Mat_<char>(3, 3) << 0,-1,0,-1,5,-1,0,-1,0 );
filter2D(src,dst,src.depth(),kernel);/////提高对比度
namedWindow("contrast image demo", WINDOW_AUTOSIZE);
imshow("contrast image demo",dst);
}
void test03() {
Mat src, dst;
src = imread("D:/opencvsp/pic.png");
namedWindow("input",WINDOW_AUTOSIZE);
namedWindow("out",WINDOW_AUTOSIZE);
cvtColor(src,dst,COLOR_BGR2GRAY);
printf("input image channels: %d ",src.channels());
printf("out image channels: %d ",dst.channels());
dst = Mat(src.size(),src.type());
dst = Scalar(127,0,255);
const uchar* firstRow = dst.ptr<uchar>(0);
Mat M(3, 3, CV_8UC3, Scalar(0, 0, 255));
Mat m2 = Mat(2, 2, CV_8UC1);//
Mat m22 = Mat::eye(2, 2, CV_8UC1);
imshow("output",dst);
}
void test04() {
Mat src, gray_src;
src = imread("D:/opencvsp/pic.png");
if (src.empty())
{
std::cout << "could not load image" << std::endl;
return -1;
}
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src);
cvtColor(src, gray_src, COLOR_BGR2GRAY);
namedWindow("output", WINDOW_AUTOSIZE);
imshow("output", gray_src);
int height = gray_src.rows;
int width = gray_src.cols;
//单通道
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
int gray = gray_src.at<uchar>(row, col);
gray_src.at<uchar>(row, col) = 255 - gray;
}
}
namedWindow("gray_invert", WINDOW_AUTOSIZE);
imshow("gray_invert", gray_src);
Mat dst,dst2;
src = imread("D:/opencvsp/pic.png");
dst.create(src.size(), src.type());
cvtColor(src, gray_src, COLOR_BGR2GRAY);
namedWindow("output", WINDOW_AUTOSIZE);
imshow("output", gray_src);
int heightt = gray_src.rows;
int widthh = gray_src.cols;
int nc = src.channels();
for (int row = 0; row < heightt; row++)
{
for (int col = 0; col < widthh; col++)
{
if (nc == 1)
{
int gray = gray_src.at<uchar>(row, col);
gray_src.at<uchar>(row, col) = 255 - gray;
}
else
{
int b = src.at<Vec3b>(row, col)[0];
int g = src.at<Vec3b>(row, col)[1];
int r = src.at<Vec3b>(row, col)[2];
dst.at<Vec3b>(row, col)[0] = 255 - b;
dst.at<Vec3b>(row, col)[1] = 255 - g;
dst.at<Vec3b>(row, col)[2] = 255 - r;
//灰度图
gray_src.at<uchar>(row, col) = max(r, max(b,g));
gray_src.at<uchar>(row, col) = min(r, min(b, g));
}
}
}
namedWindow("dst", WINDOW_AUTOSIZE);
imshow("dst", dst);
//取反像素
bitwise_not(src, dst2);
namedWindow("dstt", WINDOW_AUTOSIZE);
imshow("dstt", dst2);
}
//图像混合
void(){
Mat src1,src2, dst;
src1 = imread("D:/opencvsp/pic.png");
src1 = imread("D:/opencvsp/ad.png");
if (!src1.empty())
{
std::cout << "could not load image" << std::endl;
return -1;
}
if (!src2.empty())
{
std::cout << "could not load image" << std::endl;
return -1;
}
double alpha = 0.5;
if (src1.rows == src2.rows && src1.cols == src2.cols && src1.type == src2.type)
{
//
addWeighted(src1,alpha,src2,(1-alpha),0.0,dst);
//直接相加的函数,效果不佳
//add(src1,src2,dst,Mat());
multiply(src1,src2,dst,1.0);
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src1);
imshow("input", src2);
namedWindow("blend", WINDOW_AUTOSIZE);
imshow("blend", dst);
}
else
{
printf("could not blend iamges");
}
}
//
//调整图像的亮度和对比度
Mat src, dst;
src = imread("D:/opencvsp/pic.png");
if (!src.data)
{
printf("could not load image");
return -1;
}
//如果转灰度图片
cvtColor(src,src,COLOR_BGR2GRAY);
namedWindow("inputimage",WINDOW_AUTOSIZE);
imshow("inputimage",src);
int height = src.rows;
int width = src.cols;
dst = Mat::zeros(src.size(),src.type());
float alpha = 1.2;
float beta = 30;
Mat m1;
src.convertTo(m1,CV_32F);
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
if (src.channels() == 3)
{
float b = m1.at<Vec3f>(row, col)[0];
float g = m1.at<Vec3f>(row, col)[1];
float r = m1.at<Vec3f>(row, col)[2];
dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b * alpha + beta);
dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(r * alpha + beta);
dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(g * alpha + beta);
}
else
{
float v = src.at<uchar>(row, col);
dst.at<uchar>(row, col) = saturate_cast<uchar>(v * alpha + beta);
}
}
}
namedWindow("output", WINDOW_AUTOSIZE);
Mat bgImage;
const char* drawdemo_win = "draw shapes text";
void MyLines();
void MyRectangle();
void MyEllipse();
void MyCircle();
void MyPolygon();
void RandomLineDome();
int main(int argc, char** argv) {
//绘制形状与文字
bgImage = imread("D:/opencvsp/pic.png");
if (!bgImage.data)
{
printf("could not load image .. ");
return -1;
}
MyEllipse();
MyCircle();
//打印文字
putText(bgImage,"Hello opencv",Point(300,300),FONT_HERSHEY_COMPLEX,2.0,Scalar(12,255,200),1,8);
namedWindow(drawdemo_win,WINDOW_AUTOSIZE);
imshow(drawdemo_win,bgImage);
waitKey(0);
return 0;
}
void MyLines() {
Point p1 = Point(20,30);
Point p2;
p2.x = 300;
p2.y = 300;
Scalar color = Scalar(0,0,255);
line(bgImage,p1,p2,color,1,LINE_AA); //反锯齿
}
void MyRectangle() {
Rect rect = Rect(200, 100, 300, 300);
Scalar color = Scalar();
rectangle(bgImage,rect,color);
}
void MyEllipse() {
//椭圆
Scalar color = Scalar(0,255,0);
//圆心 长轴 短轴 倾斜度
ellipse(bgImage,Point(bgImage.cols /2,bgImage.rows / 2),Size(bgImage.cols / 4, bgImage.rows / 8),90,0,360,color,1,LINE_8);
}
void MyCircle() {
Scalar color = Scalar(0, 255, 255);
Point center = Point(bgImage.cols / 2, bgImage.rows / 2);
circle(bgImage, center, 150,color, 1, 8);
}
void MyPolygon() {
Point pts[1][5];
pts[0][0] = Point(100,100);
pts[0][1] = Point(100, 200);
pts[0][2] = Point(200, 200);
pts[0][3] = Point(200, 100);
pts[0][4] = Point(100, 100);
const Point* ppts[] = { pts[0] };
int npt[] = { 5 };
Scalar color = Scalar{255, 12, 255};
fillPoly(bgImage, ppts, npt, 1, color, 8);
};
void RandomLineDome() {
RNG rng(12345);
Point pt1;
Point pt2;
Mat bg = Mat::zeros(bgImage.size(), bgImage.type());
namedWindow("randow",WINDOW_AUTOSIZE);
for (int i = 0; i < 10; i++)
{
pt1.x = rng.uniform(0, bgImage.cols);
pt2.x = rng.uniform(0, bgImage.cols);
pt1.y = rng.uniform(0, bgImage.rows);
pt2.y = rng.uniform(0, bgImage.rows);
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
if (waitKey(50) > 0)
{
break;
}
line(bg, pt1, pt2, color, 1, 8);
imshow("randow", bg);
}
}
/*
//图像模糊
Mat src, dst;
src = imread("D:/opencvsp/pic.png");
if (!src.data)
{
printf("could not load image.. ");
return -1;
}
char intput_title[] = "intput image";
char output_title[] = "blur_image";
namedWindow(intput_title, WINDOW_AUTOSIZE);
namedWindow(output_title, WINDOW_AUTOSIZE);
imshow(intput_title,src);
//size(29,3)
blur(src,dst,Size(3,3),Point(-1,-1));
imshow(output_title,dst);
Mat gaudst;////size(11,11)
GaussianBlur(src, gaudst, Size(5, 5), 11, 11);
imshow("gaussian",gaudst);
void medianblue() {
Mat src, dst;
src = imread("D:/opencvsp/pic.png");
if (!src.data)
{
printf("could not load image.. ");
return -1;
}
namedWindow("input img", WINDOW_AUTOSIZE);
imshow("input img", src);
//中间滤波
medianBlur(src, dst, 3);
namedWindow("medianBlur", WINDOW_AUTOSIZE);
imshow("medianBlur", dst);
//双边滤波
bilateralFilter(src, dst, 15, 150, 3);
namedWindow("bilateralFilter", WINDOW_AUTOSIZE);
imshow("bilateralFilter", dst);
//
Mat resultimg;
Mat kernel = (Mat_<int>(3, 3) << 0, -1, 0, -1, -5, -1, 0, -1, 0);
filter2D(dst,resultimg,-1,kernel,Point(-1,-1),0);
imshow("final result", resultimg);
}
**/
Mat src, dst;
int element_size = 3;
int max_size = 21;
//膨胀与腐蚀
void CallBack_Demo(int,void*);
int main(int argc, char** argv) {
char output_win[] = "output image";
src = imread("D:/opencvsp/pic.png");
if (!src.data)
{
printf("could not load image.. ");
return -1;
}
namedWindow("input img", WINDOW_AUTOSIZE);
imshow("input img", src);
namedWindow(output_win, WINDOW_AUTOSIZE);
createTrackbar("Element Size", output_win, &element_size,max_size,CallBack_Demo);
waitKey(0);
return 0;
}
void CallBack_Demo(int, void*) {
int s = element_size * 2 + 1;
Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
//膨胀
dilate(src, dst, structureElement, Point(-1, -1), 1);
//腐蚀
erode(src, dst, structureElement);
imshow("output win", dst);
return;
}
// 形态学
char output_win[] = "output image";
src = imread("D:/opencvsp/pic.png");
if (!src.data)
{
printf("could not load image.. ");
return -1;
}
namedWindow("input img", WINDOW_AUTOSIZE);
imshow("input img", src);
char output_title[] = "morphologydemo";
//先腐蚀后膨胀 可以去掉小的对象,背景是黑色
Mat kernel = getStructuringElement(MORPH_RECT,Size(11,11),Point(-1,-1));
morphologyEx(src,dst, MORPH_OPEN,kernel);
imshow(output_title, dst);
//闭操作 可以填充小洞 先膨胀后腐蚀
morphologyEx(src, dst, MORPH_CLOSE, kernel);
imshow("close", dst);
//形态学梯度
morphologyEx(src, dst, MORPH_GRADIENT, kernel);
imshow("gradient",dst);
//顶帽
morphologyEx(src, dst, MORPH_TOPHAT, kernel);
imshow("gradient", dst);
//黑帽 闭操作图像与源图像的插值图像
morphologyEx(src, dst, MORPH_BLACKHAT, kernel);
imshow("gradient", dst);
char output_win[] = "output image";
src = imread("D:/opencvsp/pic.png");
if (!src.data)
{
printf("could not load image.. ");
return -1;
}
namedWindow("input img", WINDOW_AUTOSIZE);
imshow("input img", src);
//提取水平线
Mat gray_src;
cvtColor(src, gray_src, COLOR_BGR2GRAY);
imshow("gray_iamge", gray_src);
/***
adaptiveThreshold(
Mat src,Mat dest,
doule maxValue,// 二值图像最大值
int adaptiveMethod// 自适应方法,只能其中之一 ADAPTIVE_THRESH_MEAN_C, ADAPTIVE_THRESH_GAUSSIAN_C
int thresholdType,//阈值类型
int blockSzie,块大小
double c 常量c可是是正数,0, 负数
)
*/
Mat binImg;
adaptiveThreshold(gray_src, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
imshow("binary image", binImg);
//横线 竖线 矩形
Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 16, 1), Point(-1, -1));
Mat vline = getStructuringElement(MORPH_RECT, Size(1, src.rows / 16), Point(-1, -1));
Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1));
Mat temp;
erode(binImg, temp, hline);
dilate(temp, dst, hline);
imshow("final result", temp);
morphologyEx(binImg, dst, MORPH_OPEN, vline);
bitwise_not(dst, dst);
blur(dst, dst, Size(3, 3), Point(-1, -1));
imshow("final tow", dst);