Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
3 | PointedEar | 1 | /*------------------------------------------------------------------------------------------*\ |
2 | This file contains material supporting chapter 5 of the cookbook: |
||
3 | Computer Vision Programming using the OpenCV Library. |
||
4 | by Robert Laganiere, Packt Publishing, 2011. |
||
5 | |||
6 | This program is free software; permission is hereby granted to use, copy, modify, |
||
7 | and distribute this source code, or portions thereof, for any purpose, without fee, |
||
8 | subject to the restriction that the copyright notice may not be removed |
||
9 | or altered from any source or altered source distribution. |
||
10 | The software is released on an as-is basis and without any warranties of any kind. |
||
11 | In particular, the software is not guaranteed to be fault-tolerant or free from failure. |
||
12 | The author disclaims all warranties with regard to this software, any use, |
||
13 | and any consequent failure, is purely the responsibility of the user. |
||
14 | |||
15 | Copyright (C) 2010-2011 Robert Laganiere, www.laganiere.name |
||
16 | \*------------------------------------------------------------------------------------------*/ |
||
17 | |||
18 | #include <opencv2/core/core.hpp> |
||
19 | #include <opencv2/imgproc/imgproc.hpp> |
||
20 | #include <opencv2/highgui/highgui.hpp> |
||
21 | #include "morphoFeatures.h" |
||
22 | |||
23 | int main() |
||
24 | { |
||
25 | // Read input image |
||
26 | cv::Mat image= cv::imread("../building.jpg",0); |
||
27 | if (!image.data) |
||
28 | return 0; |
||
29 | |||
30 | // Display the image |
||
31 | cv::namedWindow("Image"); |
||
32 | cv::imshow("Image",image); |
||
33 | |||
34 | // Create the morphological features instance |
||
35 | MorphoFeatures morpho; |
||
36 | morpho.setThreshold(40); |
||
37 | |||
38 | // Get the edges |
||
39 | cv::Mat edges; |
||
40 | edges= morpho.getEdges(image); |
||
41 | |||
42 | // Display the edge image |
||
43 | cv::namedWindow("Edge Image"); |
||
44 | cv::imshow("Edge Image",edges); |
||
45 | |||
46 | // Get the corners |
||
47 | morpho.setThreshold(-1); |
||
48 | cv::Mat corners; |
||
49 | corners= morpho.getCorners(image); |
||
50 | cv::morphologyEx(corners,corners,cv::MORPH_TOPHAT,cv::Mat()); |
||
51 | cv::threshold(corners, corners, 40, 255, cv::THRESH_BINARY_INV); |
||
52 | |||
53 | // Display the corner image |
||
54 | cv::namedWindow("Corner Image"); |
||
55 | cv::imshow("Corner Image",corners); |
||
56 | |||
57 | // Display the corner on the image |
||
58 | morpho.drawOnImage(corners,image); |
||
59 | cv::namedWindow("Corners on Image"); |
||
60 | cv::imshow("Corners on Image",image); |
||
61 | |||
62 | // Read and display image of square |
||
63 | image= cv::imread("../square.bmp",0); |
||
64 | cv::namedWindow("Square Image"); |
||
65 | cv::imshow("Square Image",image); |
||
66 | |||
67 | // Creating the cross-shaped structuring element |
||
68 | cv::Mat cross(5,5,CV_8U,cv::Scalar(0)); |
||
69 | for (int i=0; i<5; i++) { |
||
70 | |||
71 | cross.at<uchar>(2,i)= 1; |
||
72 | cross.at<uchar>(i,2)= 1; |
||
73 | } |
||
74 | |||
75 | // Dilate with a cross |
||
76 | cv::Mat result; |
||
77 | cv::dilate(image,result,cross); |
||
78 | |||
79 | // Display the result |
||
80 | cv::namedWindow("Dilated square with cross"); |
||
81 | cv::imshow("Dilated square with cross",result); |
||
82 | |||
83 | // Creating the diamond-shaped structuring element |
||
84 | cv::Mat diamond(5,5,CV_8U,cv::Scalar(1)); |
||
85 | diamond.at<uchar>(0,0)= 0; |
||
86 | diamond.at<uchar>(0,1)= 0; |
||
87 | diamond.at<uchar>(1,0)= 0; |
||
88 | diamond.at<uchar>(4,4)= 0; |
||
89 | diamond.at<uchar>(3,4)= 0; |
||
90 | diamond.at<uchar>(4,3)= 0; |
||
91 | diamond.at<uchar>(4,0)= 0; |
||
92 | diamond.at<uchar>(4,1)= 0; |
||
93 | diamond.at<uchar>(3,0)= 0; |
||
94 | diamond.at<uchar>(0,4)= 0; |
||
95 | diamond.at<uchar>(0,3)= 0; |
||
96 | diamond.at<uchar>(1,4)= 0; |
||
97 | |||
98 | // Erode with a diamond |
||
99 | cv::Mat result2; |
||
100 | cv::erode(result,result2,diamond); |
||
101 | |||
102 | // Display the result |
||
103 | cv::namedWindow("Eroded square with diamond"); |
||
104 | cv::imshow("Eroded square with diamond",result2); |
||
105 | |||
106 | // Combine the images into one |
||
107 | cv::Mat final(100,300,CV_8U); |
||
108 | cv::Mat window= final(cv::Rect(0,0,100,100)); |
||
109 | image.copyTo(window); |
||
110 | window= final(cv::Rect(100,0,100,100)); |
||
111 | result.copyTo(window); |
||
112 | window= final(cv::Rect(200,0,100,100)); |
||
113 | result2.copyTo(window); |
||
114 | |||
115 | // Display the combined result |
||
116 | cv::namedWindow("Combined"); |
||
117 | cv::imshow("Combined",final); |
||
118 | |||
119 | // Save combined result |
||
120 | cv::imwrite("squares.bmp",final); |
||
121 | |||
122 | cv::waitKey(); |
||
123 | |||
124 | return 0; |
||
125 | } |