#include <opencv2\opencv.hpp>
#include <iostream>
#include <string>
#include <stdio.h>
//#include <math.h>
//#include "rect_detector.h"
//#include "artifacts_detector.h"
//#include "mura_detector.h"
//#include "curve_detector.h"
#include <cv.hpp>
using namespace cv;
using namespace std;
//定义灰度图像变量
IplImage *g_GrayImage = NULL;
//定义二值化图片变量
IplImage *g_BinaryImage = NULL;
//定义二值化窗口标题
const char *WindowBinaryTitle = "二值化图片";
//定义滑块响应函数
//创建源图像窗口标题变量
const char *WindowSrcTitle = "灰度图像";
//创建滑块标题变量
const char *TheSliderTitle = "二值化阀值";
//const char *SrcPath = "C:\\Users\\lenovo\\Desktop\\1.jpg"; ////定义图片路径
IplImage *g_pGrayImage_liantong = NULL;
IplImage *g_pBinralyImage_liantong = NULL;
int contour_num = 0; //数字编号
char number_buf[10]; ////数字编号存入数组,puttext
#define num_col 11 ////二维数组的列,每一个点缺陷信息的详细信息
long int liantong_all_area = 0; ////连通区域总面积
long int Rect_all_area = 0; //// 保存最小外接矩形总的面积
////=====================================================================
struct my_struct1{
double scale; //// 定义显示图像的比例
const int threshold_value_binaryzation; ////定义第一次二值化阀值
const int threshold_value_second_binaryzation; ////定义第二次二值化阀值
};
my_struct1 picture = { 0.5, 50, 100 };
////=====================================================================
struct my_struct2{
int Model1_k1; ////图像膨胀腐蚀
int Model1_k2; ////图像膨胀腐蚀
int Model2_k1; ////图像膨胀腐蚀
int Model2_k2; ////图像膨胀腐蚀
};
my_struct2 value = { 5, 2, 3, 2 };
////=====================================================================
struct my_struct3{
double maxarea; ////最大缺陷面积
double minarea; ////最小显示保留的缺陷面积
double font_scale; ////字体大小
int font_thickness; ////字体粗细
const int Feature_value2_number; ////定义一个二维数组的列,即缺陷的个数
};
my_struct3 value2 = { 5000, 1000, 0.6, 0.8, 100 };
////=====================================================================
struct my_struct4{
const int hough_Canny_thresh1;
const int hough_Canny_thresh2;
const int hough_Canny_kernel;
const int cvHoughLines2_thresh; ////像素值大于多少才显示,值越大,显示的线段越少
const int cvHoughLines2_param1; ////显示线段的最小长度
const int cvHoughLines2_param2; ////线段之间的 最小间隔
};
my_struct4 Hough = { 50, 100, 3, 50, 20, 10 };
void fft2(IplImage *src, IplImage *dst)
{ //实部、虚部
IplImage *image_Re = 0, *image_Im = 0, *Fourier = 0;
// int i, j;
image_Re = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1); //实部
//Imaginary part
image_Im = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1); //虚部
//2 channels (image_Re, image_Im)
Fourier = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 2);
// Real part conversion from u8 to 64f (double)
cvConvertScale(src, image_Re);
// Imaginary part (zeros)
cvZero(image_Im);
// Join real and imaginary parts and stock them in Fourier image
cvMerge(image_Re, image_Im, 0, 0, Fourier);
// Application of the forward Fourier transform
cvDFT(Fourier, dst, CV_DXT_FORWARD);
cvReleaseImage(&image_Re);
cvReleaseImage(&image_Im);
cvReleaseImage(&Fourier);
}
void fft2shift(IplImage *src, IplImage *dst)
{
IplImage *image_Re = 0, *image_Im = 0;
int nRow, nCol, i, j, cy, cx;
double scale, shift, tmp13, tmp24;
image_Re = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1);
//Imaginary part
image_Im = cvCreateImage(cvGetSize(src), IPL_DEPTH_64F, 1);
cvSplit(src, image_Re, image_Im, 0, 0);
//具体原理见冈萨雷斯数字图像处理p123
// Compute the magnitude of the spectrum Mag = sqrt(Re^2 + Im^2)
//计算傅里叶谱
cvPow(image_Re, image_Re, 2.0);
cvPow(image_Im, image_Im, 2.0);
cvAdd(image_Re, image_Im, image_Re);
cvPow(image_Re, image_Re, 0.5);
//对数变换以增强灰度级细节(这种变换使以窄带低灰度输入图像值映射
//一宽带输出值,具体可见冈萨雷斯数字图像处理p62)
// Compute log(1 + Mag);
cvAddS(image_Re, cvScalar(1.0), image_Re); // 1 + Mag
cvLog(image_Re, image_Re); // log(1 + Mag)
//Rearrange the quadrants of Fourier image so that the origin is at the image center
nRow = src->height;
nCol = src->width;
cy = nRow / 2; // image center
cx = nCol / 2;
//CV_IMAGE_ELEM为OpenCV定义的宏,用来读取图像的像素值,这一部分就是进行中心变换
for (j = 0; j < cy; j++){
for (i = 0; i < cx; i++){
//中心化,将整体份成四块进行对角交换
tmp13 = CV_IMAGE_ELEM(image_Re, double, j, i);
CV_IMAGE_ELEM(image_Re, double, j, i) = CV_IMAGE_ELEM(
image_Re, double, j + cy, i + cx);
CV_IMAGE_ELEM(image_Re, double, j + cy, i + cx) = tmp13;
tmp24 = CV_IMAGE_ELEM(image_Re, double, j, i + cx);
CV_IMAGE_ELEM(image_Re, double, j, i + cx) =
CV_IMAGE_ELEM(image_Re, double, j + cy, i);
CV_IMAGE_ELEM(image_Re, double, j + cy, i) = tmp24;
}
}
//归一化处理将矩阵的元素值归一为[0,255]
//[(f(x,y)-minVal)/(maxVal-minVal)]*255
double minVal = 0, maxVal = 0;
// Localize minimum and maximum values
cvMinMaxLoc(image_Re, &minVal, &maxVal);
// Normalize image (0 - 255) to be observed as an u8 image
scale = 255 / (maxVal - minVal);
shift = -minVal * scale;
cvConvertScale(image_Re, dst, scale, shift);
cvReleaseImage(&image_Re);
cvReleaseImage(&image_Im);
}
////=====================================================================
//自适应中值滤波
uchar adaptiveProcess(const Mat &im, int row, int col, int kernelSize, int maxSize)
{
vector<uchar> pixels;
for (int a = -kernelSize / 2; a <= kernelSize / 2; a++)
for (int b = -kernelSize / 2; b <= kernelSize / 2; b++)
{
pixels.push_back(im.at<uchar>(row + a, col + b));
}
sort(pixels.begin(), pixels.end());
auto min = pixels[0];
auto max = pixels[kernelSize * kernelSize - 1];
auto med = pixels[kernelSize * kernelSize / 2];
auto zxy = im.at<uchar>(row, col);
if (med > min && med < max)
{
// to B
if (zxy > min && zxy < max)
return zxy;
else
return med;
}
else
{
kernelSize += 2;
if (kernelSize <= maxSize)
return adaptiveProcess(im, row, col, kernelSize, maxSize); // 增大窗口尺寸,继续A过程。
else
return med;
}
}
int** on_trackbar(const char *SrcPath = "1.BMP"){
CvSeq* contour = 0;
CvSeq* _contour = contour;
//定义存放数组的二维数组,返回指针数组
int** Feature_value2 = 0;
Feature_value2 = new int*[value2.Feature_value2_number];
IplImage *SrcImage_or;
CvSize src_sz;
////===============================================================================================预处理
//载入原图
printf("预处理\n");
IplImage *SrcImage_origin = cvLoadImage(SrcPath, CV_LOAD_IMAGE_UNCHANGED);
//缩放
src_sz.width = SrcImage_origin->width* picture.scale;
src_sz.height = SrcImage_origin->height* picture.scale;
SrcImage_or = cvCreateImage(src_sz, SrcImage_origin->depth, SrcImage_origin->nChannels);
cvResize(SrcImage_origin, SrcImage_or, CV_INTER_CUBIC);
//cvNamedWindow("原图", 0);
////显示原图到原图窗口
//cvShowImage("原图", SrcImage_or);
//单通道灰度化处理
if (SrcImage_or->nChannels > 1)
{
g_GrayImage = cvCreateImage(cvSize(SrcImage_or->width, SrcImage_or->height), IPL_DEPTH_8U, 1);
cvCvtColor(SrcImage_or, g_GrayImage, CV_BGR2GRAY);
}
else
g_GrayImage = SrcImage_or;
//抑制曝光过度
//IplImage *src_threshold = cvCreateImage(cvGetSize(SrcImage_or), IPL_DEPTH_8U, 1);
//cvThreshold(SrcImage_or, src_threshold, 100, 255, CV_THRESH_BINARY);
for (int i = 0; i < src_sz.height; i++)
{
for (int j = 0; j < src_sz.width; j++)
{
if (cvGet2D(g_GrayImage, i, j).val[0]>100)
cvSet2D(g_GrayImage, i, j, 100);
}
}
//cvNamedWindow("抑制", 0);
//////显示原图到原图窗口
//cvShowImage("抑制", SrcImage_or);
/// 应用直方图均衡化
IplImage *src_his = cvCreateImage(src_sz, g_GrayImage->depth, g_GrayImage->nChannels);
cvEqualizeHist(g_GrayImage, src_his);
cvSaveImage("均衡化.jpg",src_his);
//fft�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【资源说明】 基于C++传统图像处理方法实现导光板缺陷检测源码+项目说明+详细注释.zip基于C++传统图像处理方法实现导光板缺陷检测源码+项目说明+详细注释.zip基于C++传统图像处理方法实现导光板缺陷检测源码+项目说明+详细注释.zip基于C++传统图像处理方法实现导光板缺陷检测源码+项目说明+详细注释.zip基于C++传统图像处理方法实现导光板缺陷检测源码+项目说明+详细注释.zip基于C++传统图像处理方法实现导光板缺陷检测源码+项目说明+详细注释.zip 基于C++传统图像处理方法实现导光板缺陷检测源码+项目说明+详细注释.zip # 文件 --------- 1. `gt1.jpg`,`gt2.jpg`以及`gt3.jpg`为标注图像; 2. `1.BMP`,`2.BMP`以及`3.PNG`为对应图像裁剪后的图像; 3. `detect.cpp`即为本项目代码文件。 # 实验环境 ------- 1.硬件环境:Windows 7x64,i3处理器; 2.软件环境:VS2013, openCV 3.0 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载,沟通交流,互相学习,共同进步!
资源推荐
资源详情
资源评论
收起资源包目录
基于C++传统图像处理方法实现导光板缺陷检测源码+项目说明+详细注释.zip (11个子文件)
项目说明.md 3KB
3.png 2.33MB
1.jpg 730KB
detect.m 3KB
gt2.JPG 4.32MB
gt3.JPG 1.69MB
gt1.JPG 4.57MB
膨胀腐蚀.jpg 131KB
1.bmp 8.12MB
detect.cpp 18KB
2.bmp 11.66MB
共 11 条
- 1
资源评论
onnx
- 粉丝: 9696
- 资源: 5598
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Java 代码覆盖率库.zip
- Java 代码和算法的存储库 也为该存储库加注星标 .zip
- 免安装Windows10/Windows11系统截图工具,无需安装第三方截图工具 双击直接使用截图即可 是一款免费可靠的截图小工具哦~
- Libero Soc v11.9的安装以及证书的获取(2021新版).zip
- BouncyCastle.Cryptography.dll
- 5.1 孤立奇点(JD).ppt
- 基于51单片机的智能交通灯控制系统的设计与实现源码+报告(高分项目)
- 什么是 SQL 注入.docx
- Windows 11上启用与禁用网络发现功能的操作指南
- Java Redis 客户端 GUI 工具.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功