在处理本节的程序时遇到的问题:
函数使用有问题,内存过载
附加依赖项使用的是d.lib文件,库也只用了cv库,错误原因在于:处理jpg图像文件时弹出错误,
png图像文件没有问题,原因??
问题代码:
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
#include<opencv2/highgui/highgui_c.h>
using namespace cv;
int main(int argc, char** argv) {
Mat src, dst;
src = imread("D:/桌面/code/opencvlearn/配套代码/课程配套代码与图片5/代码与图片/tx.png");
if (!src.data) {
printf("could not load image...\n");
}
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src);
namedWindow("output image", CV_WINDOW_AUTOSIZE);//这行导致输出一个全灰的output图像
Mat gray_src;
cvtColor(src, gray_src, CV_BGR2BGRA);
imshow("gray iamge", gray_src);
为什么没有进行灰度处理?
成功调试
正确代码如下:
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
#include<opencv2/highgui/highgui_c.h>
using namespace cv;
int main(int argc, char** argv) {
Mat src, dst;
src = imread("D:/桌面/code/opencvlearn/配套代码/课程配套代码与图片5/代码与图片/tx.png");
if (!src.data) {
printf("could not load image...\n");
}
char INPUT_WIN[] = "input image";
char OUTPUT_WIN[] = "result image";
namedWindow(INPUT_WIN, CV_WINDOW_AUTOSIZE);
imshow(INPUT_WIN, src);
Mat gray_src;
cvtColor(src,gray_src,CV_BGR2GRAY);
imshow("gray image", gray_src);
waitKey(0);
return 0;
}
总结:多清理解决方案, 给窗口命名时多使用先char编辑窗口名称字符后nameWindow命名的形式
char INPUT_WIN[]="input image";
nameWindow(INPUT_WIN,CV_WINDOW_AUTOSIZE);
原理方法
图像形态学操作时候,可以通过自定义的结构元素实现结构元素对输入图像一些对象敏感、另外一些对象不敏感,这样就会让敏感的对象改变而不敏感的对象保留输出。通过使用两个最基本的
形态学操作 – 膨胀与腐蚀,使用不同的结构元素实现对输入图像
的操作、得到想要的结果。
- 膨胀,输出的像素值是结构元素覆盖下输入图像的最大像素值
- 腐蚀,输出的像素值是结构元素覆盖下输入图像的最小像素值
二值图像与灰度图像上的膨胀操作-最大像素值
二值图像与灰度图像上的腐蚀操作-最小像素值
结构元素
使用任意的结构元素,常见的结构元素有 矩形、园、直线、磁盘形状、砖石形状等各种自定义形状
提取步骤
ladaptiveThreshold(
Mat src, // 输入的灰度图像
Mat dest, // 二值图像
double maxValue, // 二值图像最大值
int adaptiveMethod // 自适应方法,只能其中之一 –
// ADAPTIVE_THRESH_MEAN_C , ADAPTIVE_THRESH_GAUSSIAN_C
int thresholdType,// 阈值类型
int blockSize, // 块大小
double C // 常量C 可以是正数,0,负数
)
代码如下:
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
#include<opencv2/highgui/highgui_c.h>
using namespace cv;
int main(int argc, char** argv) {
Mat src, dst;
src = imread("D:/桌面/code/opencvlearn/配套代码/课程配套代码与图片5/代码与图片/tx.png");
if (!src.data) {
printf("could not load image...\n");
}
char INPUT_WIN[] = "input image";//char输入窗口
char OUTPUT_WIN[] = "result image";//char输出窗口
namedWindow(INPUT_WIN, CV_WINDOW_AUTOSIZE);
namedWindow(OUTPUT_WIN, CV_WINDOW_AUTOSIZE);
imshow(INPUT_WIN, src);
Mat gray_src;
cvtColor(src,gray_src, CV_BGR2GRAY);
imshow("gray image", gray_src);
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一个结构元素 矩形 Size(src.cols/16,1)代表这是横线,Point(-1,-1)代表结构元素的中心点
Mat sline = getStructuringElement(MORPH_RECT, Size(1, src.rows / 16), Point(-1, -1));//Mat一个结构元素 矩形 Size(1,src.rows/16)代表这是竖线,Point(-1,-1)代表结构元素的中心点
/*Mat temp;先膨胀后腐蚀也就是 开操作
erode(binImg, temp, hline);
dilate(temp, dst, hline);*/
morphologyEx(binImg, dst, CV_MOP_OPEN, sline);//开操作
bitwise_not(dst, dst);//反色 黑背景换白
blur(dst, dst, Size(5,5), Point(-1, -1));//模糊 加粗线条
/*imshow("erode image", temp);*/
imshow(OUTPUT_WIN, dst);
waitKey(0);
return 0;
}
完成效果如下:
水平结构元素hline
竖直结构元素sline
如下是矩形结构元素 kernel 可以过滤掉一些细线的干扰
Mat kernel = getStructuringElement(MORPH_RECT,Size(3,3),Point(-1,-1));