一开始就出来幺蛾子,之前装好的opencv怎么都找不到包,弄了一个小时,夹着红框后面的三句,告诉clion我安装的opencv包的具体位置,可能是因为我之前没有编译成功,直接间别人编译好的直接下载下来的,不过我为什么不用python上面的opencv那。
#include
#include
#include
#include
#include using namespace std;
using namespace cv;struct RectPoint{int x,y;int width,height;RectPoint(int x,int y,int width,int height):x(x),y(y),width(width),height(height){}
};void ClipImage(String ImagePath,RectPoint rect,String TargetPath){// 声明Mat保存图片Mat img;Rect m_select;string line;// 判定文件存在ifstream input_file(ImagePath);if (!input_file.is_open()) {cerr << "Could not open the file - '"<< ImagePath << "'" << endl;return;}while(getline(input_file,line)){// 获取文件后缀名,并进行拼接成目标文件名string ImageName = line.substr(line.find_last_of('\\',line.size())+1);string TargetName = TargetPath;TargetName.append(ImageName);// 读取并剪裁图片到特定大小保存img = imread(line);m_select = Rect(rect.x,rect.y,rect.width,rect.height);Mat ROI = img(m_select);imwrite(TargetName,ROI);}
}int main()
{String TargetImage = R"(E:\CProject\impurityDetection\ClippedImage\)";String SourceImage = R"(E:\CProject\impurityDetection\image\path.txt)";ClipImage(SourceImage,RectPoint(600,0,1780,1480),TargetImage);return 0;
}
void Convolution(Mat &SourceImage,vector &pixels,int x,int y ,int border){for (int k = -border; k <= border; k++){for (int l = -border; l <= border; l++){pixels.push_back(SourceImage.at(x+k, y+l));}}
}Mat SelfAdaptMedianFilter(const Mat& SourceImage){// 复制原图Mat result = SourceImage.clone();// 掩膜大小为3int ksize = 3;int border = ksize /2 ;for (int i = border; i < SourceImage.rows - border; i++){for (int j = border; j < SourceImage.cols - border; j++){while(1){// 提取当前像素的邻域vector pixels;Convolution(result, pixels, i, j, border);// 对邻域像素值进行排序sort(pixels.begin(), pixels.end());// 取中值作为当前像素的新值int median = pixels[pixels.size() / 2];int PMax = pixels[pixels.size() - 1];int PMin = pixels[0];//判定是否为异常值if (median == PMax || median == PMin) {// 掩膜再加2,重新计算ksize += 2;if (ksize + 2 > Nmax) {result.at(i, j) = median;break;}else{// 判定传入的值,是否出现越界的情况if((i - ksize / 2 < 0 || i + ksize / 2 < SourceImage.cols) ||j - ksize / 2 < 0 || j + ksize / 2 > SourceImage.rows)result.at(i,j) = (PMax + PMin) / 2;}} else {//中值不是极值,判定原像素点是不是极值,然后在进行输出if (result.at(i, j) == PMax || result.at(i, j) == PMin)result.at(i,j) = median;break;}}}}return result;
}
//对图片进行直方图均衡化,凸显出前后差异Mat equalized;// 转成二值化,并变为直方图均衡化cvtColor(ROI, equalized, COLOR_BGR2GRAY);equalizeHist(equalized, equalized);
// 对图像进行开运算,Mat morphologied;int size = 3;// shape是内核的形状,size是内核的尺寸,锚点的位置,对于矩形来说,全部都是 1 ,不用调整cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT,cv::Size(2*size + 1, 2*size+1),cv::Point(size, size));cout<
实现原理如下图
使用absdiff函数,具体描述如下,计算frame1和frame2的帧差,然后将结果保存到framediff中
cv::Mat frameDiff;
cv::absdiff(frame1, frame2, frameDiff);
//计算帧差,并将最终的结果进行返回
Mat DifFrame(Mat PreFrame,Mat CurFrame,Mat NextFrame){//计算帧差Mat FrameDiffPre , FrameDiffNext;absdiff(PreFrame,CurFrame,FrameDiffPre);absdiff(CurFrame,NextFrame,FrameDiffNext);// 分别进行二值化,设定二值化的阈值Mat BinImgPre , BinImgNext;threshold(FrameDiffPre,BinImgPre,128,255,cv::THRESH_BINARY);threshold(FrameDiffNext,BinImgPre,128,255,cv::THRESH_BINARY);// 将图片进行与运算,然后将结果进行输出Mat ResFrame;bitwise_and(FrameDiffPre,FrameDiffNext,ResFrame);//返回最终处理过后的帧return ResFrame;}