Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.18 KB | None | 0 0
  1. // LPR.cpp : This file contains the 'main' function. Program execution begins and ends there.
  2. //
  3.  
  4. #include "pch.h"
  5. #include <iostream>
  6. #include "highgui/highgui.hpp"
  7. #include "core/core.hpp"
  8. #include "opencv2/imgproc.hpp"
  9.  
  10. using namespace std;
  11. using namespace cv;
  12.  
  13. Mat converttogrey(Mat RGB)
  14. {
  15. Mat Grey = Mat::zeros(RGB.size(), CV_8UC1);
  16. for (int i = 0; i < RGB.rows; i++)
  17. {
  18. for (int j = 0; j < RGB.cols * 3; j = j + 3)
  19. {
  20. Grey.at<uchar>(i, j / 3) = (RGB.at<uchar>(i, j) + RGB.at<uchar>(i, j + 1) + RGB.at<uchar>(i, j + 2)) / 3;
  21. }
  22. }
  23. return Grey;
  24. }
  25.  
  26. Mat converttobinary(Mat Grey, int threshold)
  27. {
  28. Mat Binary = Mat::zeros(Grey.size(), CV_8UC1);
  29. for (int i = 0; i < Grey.rows; i++)
  30. for (int j = 0; j < Grey.cols; j++)
  31. if (Grey.at<uchar>(i, j) >= threshold)
  32. Binary.at<uchar>(i, j) = 255;
  33. return Binary;
  34. }
  35.  
  36. Mat StepFun(Mat Grey, int th1, int th2)
  37. {
  38. Mat Step = Mat::zeros(Grey.size(), CV_8UC1);
  39. for (int i = 0; i < Grey.rows; i++)
  40. for (int j = 0; j < Grey.cols; j++)
  41. if (Grey.at<uchar>(i, j) >= th1 && Grey.at<uchar>(i, j) <= th2)
  42. Step.at<uchar>(i, j) = 255;
  43. return Step;
  44. }
  45.  
  46. Mat Inversion(Mat Grey)
  47. {
  48. Mat Invert = Mat::zeros(Grey.size(), CV_8UC1);
  49. for (int i = 0; i < Grey.rows; i++)
  50. for (int j = 0; j < Grey.cols; j++)
  51. Invert.at<uchar>(i, j) = 255 - Grey.at<uchar>(i, j);
  52. return Invert;
  53. }
  54.  
  55. Mat Func2(Mat Grey, int Th)
  56. {
  57. Mat Second = Mat::zeros(Grey.size(), CV_8UC1);
  58. for (int i = 0; i < Grey.rows; i++)
  59. for (int j = 0; j < Grey.cols; j++)
  60. if (Grey.at<uchar>(i, j) >= Th)
  61. Second.at<uchar>(i, j) = Th;
  62. else
  63. Second.at<uchar>(i, j) = Grey.at<uchar>(i, j);
  64. return Second;
  65. }
  66.  
  67. Mat Func3(Mat Grey, int th1, int th2)
  68. {
  69. Mat Third = Mat::zeros(Grey.size(), CV_8UC1);
  70. for (int i = 0; i < Grey.rows; i++)
  71. for (int j = 0; j < Grey.cols; j++)
  72. if (Grey.at<uchar>(i, j) < th1)
  73. Third.at<uchar>(i, j) = th1;
  74. else if (Grey.at<uchar>(i, j) >= th1 && Grey.at<uchar>(i, j) <= th2)
  75. Third.at<uchar>(i, j) = th2;
  76. else
  77. Third.at<uchar>(i, j) = 255;
  78. return Third;
  79. }
  80.  
  81. Mat EHistogram(Mat Grey)
  82. {
  83. int count[256] = { 0 };
  84. float prob[256] = { 0.0 };
  85. float accProb[256] = { 0.0 };
  86. int newpixel[256] = { 0 };
  87.  
  88. for (int i = 0; i < Grey.rows; i++)
  89. for (int j = 0; j < Grey.cols; j++)
  90. count[Grey.at<uchar>(i, j)]++;
  91.  
  92. for (int i = 0; i < 256; i++)
  93. prob[i] = (float)count[i] / (float)(Grey.rows * Grey.cols);
  94.  
  95. accProb[0] = prob[0];
  96. for (int j = 1; j < 256; j++)
  97. accProb[j] = accProb[j - 1] + prob[j];
  98.  
  99. for (int i = 0; i < 256; i++)
  100. newpixel[i] = 255 * accProb[i];
  101.  
  102. Mat Equalized = Mat::zeros(Grey.size(), CV_8UC1);
  103. for (int i = 0; i < Grey.rows; i++)
  104. for (int j = 0; j < Grey.cols; j++)
  105. Equalized.at<uchar>(i, j) = newpixel[Grey.at<uchar>(i, j)];
  106. return Equalized;
  107. }
  108.  
  109. Mat AvgMask(Mat Equalized)
  110. {
  111. //float AVG = 0;
  112. //Mat MaskImg = Mat::zeros(Equalized.size(), CV_8UC1);
  113. //for (int i = 1; i < Equalized.rows - 1; i++)
  114. // for (int j = 1; j < Equalized.cols - 1; j++)
  115. // for (int ii = -1; ii <= 1; ii++)
  116. // for (int jj = -1; jj <= 1; jj++)
  117. // AVG += Equalized.at<uchar>(i + ii, j + jj);
  118. // MaskImg.at<uchar>(i, j) = AVG / 9;
  119.  
  120.  
  121. Mat MaskImg = Mat::zeros(Equalized.size(), CV_8UC1);
  122. for (int i = 1; i < Equalized.rows - 1; i++)
  123. for (int j = 1; j < Equalized.cols - 1; j++)
  124. 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;
  125. return MaskImg;
  126. }
  127.  
  128. Mat EdgeDetection(Mat MaskImg)
  129. {
  130. Mat EdgeImg = Mat::zeros(MaskImg.size(), CV_8UC1);
  131. for (int i = 1; i < MaskImg.rows - 1; i++)
  132. for (int j = 1; j < MaskImg.cols - 1; j++)
  133. {
  134. float AVGL = ((MaskImg.at<uchar>(i - 1, j - 1)) + (MaskImg.at<uchar>(i, j - 1)) + (MaskImg.at<uchar>(i + 1, j - 1))) / 3;
  135. float AVGR = ((MaskImg.at<uchar>(i - 1, j + 1)) + (MaskImg.at<uchar>(i, j + 1)) + (MaskImg.at<uchar>(i + 1, j + 1))) / 3;
  136. if (abs(AVGL - AVGR) > 50)
  137. EdgeImg.at<uchar>(i, j) = 255;
  138. }
  139. return EdgeImg;
  140. }
  141.  
  142. Mat Dilation(Mat EdgeImg, int neighbour)
  143. {
  144. Mat DilImg = Mat::zeros(EdgeImg.size(), CV_8UC1);
  145. for (int i = neighbour; i < EdgeImg.rows - neighbour; i++)
  146. for (int j = neighbour; j < EdgeImg.cols - neighbour; j++)
  147. {
  148. for (int ii = -neighbour; ii <= neighbour; ii++)
  149. for (int jj = -neighbour; jj <= neighbour; jj++)
  150. if (EdgeImg.at<uchar>(i + ii, j + jj) == 255)
  151. DilImg.at<uchar>(i, j) = 255;
  152. }
  153. return DilImg;
  154. }
  155.  
  156.  
  157. int main()
  158. {
  159. Mat img;
  160. img = imread("C:\\Users\\Aphrodite\\Desktop\\babyj.jpg");
  161. imshow("Test1", img);
  162. waitKey();
  163. Mat grey = converttogrey(img);
  164. imshow("Test2", grey);
  165. waitKey();
  166. //Mat binary = converttobinary(grey, 60);
  167. //imshow("Test3", binary);
  168. //waitKey();
  169. //Mat step = StepFun(grey, 60, 100);
  170. //imshow("Test4", step);
  171. //waitKey();
  172. //Mat inversion = Inversion(grey);
  173. //imshow("Test5", inversion);
  174. //waitKey();
  175. //Mat second = Func2(grey, 70);
  176. //imshow("Test6", second);
  177. //waitKey();
  178. //Mat third = Func3(grey, 80, 160);
  179. //imshow("Test7", third);
  180. //waitKey();
  181. Mat equalized = EHistogram(grey);
  182. imshow("Test8", equalized);
  183. waitKey();
  184. Mat avgmask = AvgMask(equalized);
  185. imshow("Test9", avgmask);
  186. waitKey();
  187. Mat edgedetection = EdgeDetection(avgmask);
  188. imshow("Test10", edgedetection);
  189. waitKey();
  190. Mat dilation = Dilation(edgedetection, 6);
  191. imshow("Test11", dilation);
  192. waitKey();
  193. Mat Blob;
  194. Blob = dilation.clone();
  195.  
  196. vector<vector<Point> > contours1;
  197. vector<Vec4i> hierarchy1;
  198. findContours(dilation, contours1, hierarchy1, RETR_EXTERNAL, CHAIN_APPROX_NONE, Point(0, 0));
  199.  
  200. Mat dst = Mat::zeros(grey.size(), CV_8UC3);
  201. {
  202. if (!contours1.empty())
  203. {
  204. for (int i = 0; i < contours1.size(); i++)
  205. {
  206. Scalar colour((rand() & 255), (rand() & 255), (rand() & 255));
  207. drawContours(dst, contours1, i, colour, CV_FILLED, 8, hierarchy1);
  208. }
  209. }
  210.  
  211. imshow("dst", dst);
  212. waitKey();
  213. }
  214.  
  215. Rect rect_first;
  216. Scalar black = CV_RGB(0, 0, 0);
  217. Mat plate;
  218. for (int i = 0; i < contours1.size(); i++)
  219. {
  220. rect_first = boundingRect(contours1[i]);
  221. if (rect_first.width < 45 || rect_first.height > 45)
  222. {
  223. drawContours(Blob, contours1, i, black, CV_FILLED, 8, hierarchy1);
  224. }
  225. else
  226. {
  227. plate = img(rect_first);
  228. //imshow("Nominated plate", plate);
  229. //waitKey();
  230. }
  231.  
  232. }
  233.  
  234. imshow("Blob", Blob);
  235. waitKey();
  236.  
  237. imshow("Blob", plate);
  238. waitKey();
  239. }
  240.  
  241. // Run program: Ctrl + F5 or Debug > Start Without Debugging menu
  242. // Debug program: F5 or Debug > Start Debugging menu
  243.  
  244. // Tips for Getting Started:
  245. // 1. Use the Solution Explorer window to add/manage files
  246. // 2. Use the Team Explorer window to connect to source control
  247. // 3. Use the Output window to see build output and other messages
  248. // 4. Use the Error List window to view errors
  249. // 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
  250. // 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