Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // LPR.cpp : This file contains the 'main' function. Program execution begins and ends there.
- //
- #include "pch.h"
- #include <iostream>
- #include "highgui/highgui.hpp"
- #include "core/core.hpp"
- #include "opencv2/imgproc.hpp"
- using namespace std;
- using namespace cv;
- Mat converttogrey(Mat RGB)
- {
- Mat Grey = Mat::zeros(RGB.size(), CV_8UC1);
- for (int i = 0; i < RGB.rows; i++)
- {
- for (int j = 0; j < RGB.cols * 3; j = j + 3)
- {
- Grey.at<uchar>(i, j / 3) = (RGB.at<uchar>(i, j) + RGB.at<uchar>(i, j + 1) + RGB.at<uchar>(i, j + 2)) / 3;
- }
- }
- return Grey;
- }
- Mat converttobinary(Mat Grey, int threshold)
- {
- Mat Binary = Mat::zeros(Grey.size(), CV_8UC1);
- for (int i = 0; i < Grey.rows; i++)
- for (int j = 0; j < Grey.cols; j++)
- if (Grey.at<uchar>(i, j) >= threshold)
- Binary.at<uchar>(i, j) = 255;
- return Binary;
- }
- Mat StepFun(Mat Grey, int th1, int th2)
- {
- Mat Step = Mat::zeros(Grey.size(), CV_8UC1);
- for (int i = 0; i < Grey.rows; i++)
- for (int j = 0; j < Grey.cols; j++)
- if (Grey.at<uchar>(i, j) >= th1 && Grey.at<uchar>(i, j) <= th2)
- Step.at<uchar>(i, j) = 255;
- return Step;
- }
- Mat Inversion(Mat Grey)
- {
- Mat Invert = Mat::zeros(Grey.size(), CV_8UC1);
- for (int i = 0; i < Grey.rows; i++)
- for (int j = 0; j < Grey.cols; j++)
- Invert.at<uchar>(i, j) = 255 - Grey.at<uchar>(i, j);
- return Invert;
- }
- Mat Func2(Mat Grey, int Th)
- {
- Mat Second = Mat::zeros(Grey.size(), CV_8UC1);
- for (int i = 0; i < Grey.rows; i++)
- for (int j = 0; j < Grey.cols; j++)
- if (Grey.at<uchar>(i, j) >= Th)
- Second.at<uchar>(i, j) = Th;
- else
- Second.at<uchar>(i, j) = Grey.at<uchar>(i, j);
- return Second;
- }
- Mat Func3(Mat Grey, int th1, int th2)
- {
- Mat Third = Mat::zeros(Grey.size(), CV_8UC1);
- for (int i = 0; i < Grey.rows; i++)
- for (int j = 0; j < Grey.cols; j++)
- if (Grey.at<uchar>(i, j) < th1)
- Third.at<uchar>(i, j) = th1;
- else if (Grey.at<uchar>(i, j) >= th1 && Grey.at<uchar>(i, j) <= th2)
- Third.at<uchar>(i, j) = th2;
- else
- Third.at<uchar>(i, j) = 255;
- return Third;
- }
- Mat EHistogram(Mat Grey)
- {
- int count[256] = { 0 };
- float prob[256] = { 0.0 };
- float accProb[256] = { 0.0 };
- int newpixel[256] = { 0 };
- for (int i = 0; i < Grey.rows; i++)
- for (int j = 0; j < Grey.cols; j++)
- count[Grey.at<uchar>(i, j)]++;
- for (int i = 0; i < 256; i++)
- prob[i] = (float)count[i] / (float)(Grey.rows * Grey.cols);
- accProb[0] = prob[0];
- for (int j = 1; j < 256; j++)
- accProb[j] = accProb[j - 1] + prob[j];
- for (int i = 0; i < 256; i++)
- newpixel[i] = 255 * accProb[i];
- Mat Equalized = Mat::zeros(Grey.size(), CV_8UC1);
- for (int i = 0; i < Grey.rows; i++)
- for (int j = 0; j < Grey.cols; j++)
- Equalized.at<uchar>(i, j) = newpixel[Grey.at<uchar>(i, j)];
- return Equalized;
- }
- Mat AvgMask(Mat Equalized)
- {
- //float AVG = 0;
- //Mat MaskImg = Mat::zeros(Equalized.size(), CV_8UC1);
- //for (int i = 1; i < Equalized.rows - 1; i++)
- // for (int j = 1; j < Equalized.cols - 1; j++)
- // for (int ii = -1; ii <= 1; ii++)
- // for (int jj = -1; jj <= 1; jj++)
- // AVG += Equalized.at<uchar>(i + ii, j + jj);
- // MaskImg.at<uchar>(i, j) = AVG / 9;
- Mat MaskImg = Mat::zeros(Equalized.size(), CV_8UC1);
- for (int i = 1; i < Equalized.rows - 1; i++)
- for (int j = 1; j < Equalized.cols - 1; j++)
- MaskImg.at<uchar>(i, j) = ((Equalized.at<uchar>(i - 1, j - 1)) + (Equalized.at<uchar>(i - 1, j)) + (Equalized.at<uchar>(i - 1, j + 1)) + (Equalized.at<uchar>(i, j - 1)) + (Equalized.at<uchar>(i, j)) + (Equalized.at<uchar>(i, j + 1)) + (Equalized.at<uchar>(i + 1, j - 1)) + (Equalized.at<uchar>(i + 1, j)) + (Equalized.at<uchar>(i + 1, j + 1))) / 9;
- return MaskImg;
- }
- Mat EdgeDetection(Mat MaskImg)
- {
- Mat EdgeImg = Mat::zeros(MaskImg.size(), CV_8UC1);
- for (int i = 1; i < MaskImg.rows - 1; i++)
- for (int j = 1; j < MaskImg.cols - 1; j++)
- {
- float AVGL = ((MaskImg.at<uchar>(i - 1, j - 1)) + (MaskImg.at<uchar>(i, j - 1)) + (MaskImg.at<uchar>(i + 1, j - 1))) / 3;
- float AVGR = ((MaskImg.at<uchar>(i - 1, j + 1)) + (MaskImg.at<uchar>(i, j + 1)) + (MaskImg.at<uchar>(i + 1, j + 1))) / 3;
- if (abs(AVGL - AVGR) > 50)
- EdgeImg.at<uchar>(i, j) = 255;
- }
- return EdgeImg;
- }
- Mat Dilation(Mat EdgeImg, int neighbour)
- {
- Mat DilImg = Mat::zeros(EdgeImg.size(), CV_8UC1);
- for (int i = neighbour; i < EdgeImg.rows - neighbour; i++)
- for (int j = neighbour; j < EdgeImg.cols - neighbour; j++)
- {
- for (int ii = -neighbour; ii <= neighbour; ii++)
- for (int jj = -neighbour; jj <= neighbour; jj++)
- if (EdgeImg.at<uchar>(i + ii, j + jj) == 255)
- DilImg.at<uchar>(i, j) = 255;
- }
- return DilImg;
- }
- int main()
- {
- Mat img;
- img = imread("C:\\Users\\Aphrodite\\Desktop\\babyj.jpg");
- imshow("Test1", img);
- waitKey();
- Mat grey = converttogrey(img);
- imshow("Test2", grey);
- waitKey();
- //Mat binary = converttobinary(grey, 60);
- //imshow("Test3", binary);
- //waitKey();
- //Mat step = StepFun(grey, 60, 100);
- //imshow("Test4", step);
- //waitKey();
- //Mat inversion = Inversion(grey);
- //imshow("Test5", inversion);
- //waitKey();
- //Mat second = Func2(grey, 70);
- //imshow("Test6", second);
- //waitKey();
- //Mat third = Func3(grey, 80, 160);
- //imshow("Test7", third);
- //waitKey();
- Mat equalized = EHistogram(grey);
- imshow("Test8", equalized);
- waitKey();
- Mat avgmask = AvgMask(equalized);
- imshow("Test9", avgmask);
- waitKey();
- Mat edgedetection = EdgeDetection(avgmask);
- imshow("Test10", edgedetection);
- waitKey();
- Mat dilation = Dilation(edgedetection, 6);
- imshow("Test11", dilation);
- waitKey();
- Mat Blob;
- Blob = dilation.clone();
- vector<vector<Point> > contours1;
- vector<Vec4i> hierarchy1;
- findContours(dilation, contours1, hierarchy1, RETR_EXTERNAL, CHAIN_APPROX_NONE, Point(0, 0));
- Mat dst = Mat::zeros(grey.size(), CV_8UC3);
- {
- if (!contours1.empty())
- {
- for (int i = 0; i < contours1.size(); i++)
- {
- Scalar colour((rand() & 255), (rand() & 255), (rand() & 255));
- drawContours(dst, contours1, i, colour, CV_FILLED, 8, hierarchy1);
- }
- }
- imshow("dst", dst);
- waitKey();
- }
- Rect rect_first;
- Scalar black = CV_RGB(0, 0, 0);
- Mat plate;
- for (int i = 0; i < contours1.size(); i++)
- {
- rect_first = boundingRect(contours1[i]);
- if (rect_first.width < 45 || rect_first.height > 45)
- {
- drawContours(Blob, contours1, i, black, CV_FILLED, 8, hierarchy1);
- }
- else
- {
- plate = img(rect_first);
- //imshow("Nominated plate", plate);
- //waitKey();
- }
- }
- imshow("Blob", Blob);
- waitKey();
- imshow("Blob", plate);
- waitKey();
- }
- // Run program: Ctrl + F5 or Debug > Start Without Debugging menu
- // Debug program: F5 or Debug > Start Debugging menu
- // Tips for Getting Started:
- // 1. Use the Solution Explorer window to add/manage files
- // 2. Use the Team Explorer window to connect to source control
- // 3. Use the Output window to see build output and other messages
- // 4. Use the Error List window to view errors
- // 5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project
- // 6. In the future, to open this project again, go to File > Open > Project and select the .sln file
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement