<div id="article_content" class="article_content tracking-ad" data-mod="popu_307" data-dsm="post">
<div class="markdown_views"><h2 id="1原始状态"><a name="t0" target="_blank"></a>1、原始状态</h2>
<p>最初的图像是这个样子的 <br>
<img src="https://img-blog.csdn.net/20161123095005323" alt="这里写图片描述" title=""> <br>
.xml文件张下面这个样子</p>
<pre class="prettyprint" name="code"><code class="hljs xml has-numbering"><span class="hljs-tag"><<span class="hljs-title">annotation</span>></span>
<span class="hljs-tag"><<span class="hljs-title">object</span>></span>
<span class="hljs-tag"><<span class="hljs-title">name</span>></span>face<span class="hljs-tag"></<span class="hljs-title">name</span>></span>
<span class="hljs-tag"><<span class="hljs-title">difficult</span>></span>0<span class="hljs-tag"></<span class="hljs-title">difficult</span>></span>
<span class="hljs-tag"><<span class="hljs-title">bndbox</span>></span>
<span class="hljs-tag"><<span class="hljs-title">xmin</span>></span>315.307918<span class="hljs-tag"></<span class="hljs-title">xmin</span>></span>
<span class="hljs-tag"><<span class="hljs-title">ymin</span>></span>240.234604<span class="hljs-tag"></<span class="hljs-title">ymin</span>></span>
<span class="hljs-tag"><<span class="hljs-title">xmax</span>></span>693.677419<span class="hljs-tag"></<span class="hljs-title">xmax</span>></span>
<span class="hljs-tag"><<span class="hljs-title">ymax</span>></span>699.683284<span class="hljs-tag"></<span class="hljs-title">ymax</span>></span>
<span class="hljs-tag"></<span class="hljs-title">bndbox</span>></span>
<span class="hljs-tag"></<span class="hljs-title">object</span>></span>
<span class="hljs-tag"></<span class="hljs-title">annotation</span>></span></code><ul class="pre-numbering" style="opacity: 0;"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul></pre>
<h2 id="2旋转图像并修改对应的xml文件"><a name="t1" target="_blank"></a>2、旋转图像并修改对应的xml文件</h2>
<pre class="prettyprint" name="code"><code class="language-python hljs has-numbering"><span class="hljs-keyword">import</span> cv2
<span class="hljs-keyword">import</span> math
<span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np
<span class="hljs-keyword">import</span> os
<span class="hljs-comment"># pdb仅仅用于调试,不用管它</span>
<span class="hljs-keyword">import</span> pdb
<span class="hljs-comment">#旋转图像的函数</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">rotate_image</span><span class="hljs-params">(src, angle, scale=<span class="hljs-number">1.</span>)</span>:</span>
w = src.shape[<span class="hljs-number">1</span>]
h = src.shape[<span class="hljs-number">0</span>]
<span class="hljs-comment"># 角度变弧度</span>
rangle = np.deg2rad(angle) <span class="hljs-comment"># angle in radians</span>
<span class="hljs-comment"># now calculate new image width and height</span>
nw = (abs(np.sin(rangle)*h) + abs(np.cos(rangle)*w))*scale
nh = (abs(np.cos(rangle)*h) + abs(np.sin(rangle)*w))*scale
<span class="hljs-comment"># ask OpenCV for the rotation matrix</span>
rot_mat = cv2.getRotationMatrix2D((nw*<span class="hljs-number">0.5</span>, nh*<span class="hljs-number">0.5</span>), angle, scale)
<span class="hljs-comment"># calculate the move from the old center to the new center combined</span>
<span class="hljs-comment"># with the rotation</span>
rot_move = np.dot(rot_mat, np.array([(nw-w)*<span class="hljs-number">0.5</span>, (nh-h)*<span class="hljs-number">0.5</span>,<span class="hljs-number">0</span>]))
<span class="hljs-comment"># the move only affects the translation, so update the translation</span>
<span class="hljs-comment"># part of the transform</span>
rot_mat[<span class="hljs-number">0</span>,<span class="hljs-number">2</span>] += rot_move[<span class="hljs-number">0</span>]
rot_mat[<span class="hljs-number">1</span>,<span class="hljs-number">2</span>] += rot_move[<span class="hljs-number">1</span>]
<span class="hljs-comment"># 仿射变换</span>
<span class="hljs-keyword">return</span> cv2.warpAffine(src, rot_mat, (int(math.ceil(nw)), int(math.ceil(nh))), flags=cv2.INTER_LANCZOS4)
//对应修改xml文件
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">rotate_xml</span><span class="hljs-params">(src, xmin, ymin, xmax, ymax, angle, scale=<span class="hljs-number">1.</span>)</span>:</span>
w = src.shape[<span class="hljs-number">1</span>]
h = src.shape[<span class="hljs-number">0</span>]
rangle = np.deg2rad(angle) <span class="hljs-comment"># angle in radians</span>
<span class="hljs-comment"># now calculate new image width and height</span>
<span class="hljs-comment"># 获取旋转后图像的长和宽</span>
nw = (abs(np.sin(rangle)*h) + abs(np.cos(rangle)*w))*scale
nh = (abs(np.cos(rangle)*h) + abs(np.sin(rangle)*w))*scale
<span class="hljs-comment"># ask OpenCV for the rotation matrix</span>
rot_mat = cv2.getRotationMatrix2D((nw*<span class="hljs-number">0.5</span>, nh*<span class="hljs-number">0.5</span>), angle, scale)
<span class="hljs-comment"># calculate the move from the old center to the new center combined</span>
<span class="hljs-comment"># with the rotation</span>
rot_move = np.dot(rot_mat, np.array([(nw-w)*<span class="hljs-number">0.5</span>, (nh-h)*<span class="hljs-number">0.5</span>,<span class="hljs-number">0</span>]))
<span class="hljs-comment"># the move only affects the translation, so update the translation</span>
<span class="hljs-comment"># part of the transform</span>
rot_mat[<span class="hljs-number">0</span>,<span class="hljs-number">2</span>] += rot_move[<span class="hljs-number">0</span>]
rot_mat[<span class="hljs-number">1</span>,<span class="hljs-number">2</span>] += rot_move[<span class="hljs-number">1</span>]
<span class="hljs-comment"># rot_mat是最终的旋转矩阵</span>
<span class="hljs-comment"># 获取原始矩形的四个中点,然后将这四个点转换到旋转后的坐标系下</span>
point1 = np.dot(rot_mat, np.array([(xmin+xmax)/<span class="hljs-number">2</span>, ymin, <span class="hljs-number">1</span>]))
point2 = np.dot(rot_mat, np.array([xmax, (ymin+ymax)/<span class="hljs-number">2</span>, <span class="hljs-number">1</span>]))
point3 = np.dot(rot_mat, np.array([(xmin+xmax)/<span class="hljs-number">2</span>, ymax, <span class="hljs-number">1</span>]))
point4 = np.dot(rot_mat, np.array([xmin, (ymin+ymax)/<span class="hljs-number">2</span>, <span class="hljs-number">1</span>]))
<span class="hljs-comment"># 合并np.array</span>
concat = np.vstack((point1, point2, point3, point4))
<span class="hljs-comment"># 改变array类型</span>
concat = concat.astype(np.int32)
<span class="hljs-keyword">print</span> concat
rx, ry, rw, rh = cv2.boundingRect(concat)
<span class="hljs-keyword">return</span> rx, ry, rw, rh
<span class="hljs-comment"># 使图像旋转60,90,120,150,210,240,300度</span>
<span class="hljs-keyword">for</span> angle <span class="hljs-keyword">in</span> (<span class="hljs-number">60</span>, <span class="hljs-number">90</span>, <span class="hljs-number">120</span>, <span class="hljs-number">150</span>, <span class="hljs-number">210</span>, <span class="hljs-number">240</span>, <span class="hljs-number">300</span>):
<span class="hljs-comment"># 指向图片所在的文件夹</span>
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> os.listdir(<span class="hljs-string">"/home/username/image"</span>):
<span class="hljs-comment"># 分离文件名与后缀</span>
a, b = os.path.splitext(i)
<span class="hljs-comment"># 如果后缀名是“.jpg”就旋转图像</span>
<span class="hljs-keyword">if</span> b == <span class="hljs-string">".jpg"</span>:
img_path = os.path.join(<span class="hljs-string">"/home/username/image"</span>, i)
img = cv2.imread(img_path)
rotated_img = rotate_image(img, angle)
<span class="hljs-comment"># 写入图像</span>
cv2.imwrite(<span class="hljs-string">"/home/yourname/rotate/"</span> + a + <span class="hljs-string">"_"</span> + str(angle) +<span class="hljs-string">"d.jpg"</span>, rotated_img)
<span class="hljs-keyword">print</span> <span class="hljs-string">"log: [%sd] %s is processed."</span> % (angle, i)
<span class="hljs-keyword">else</span>:
xml_path = os.path.join(<span class="hljs-string">"/home/username/xml"</span>, i)
img_path = <span class="hljs-string">"/home/guoyana/varied_pose/"</span> + a + <span class="hljs-string">".jpg"</span>
src = cv2.imread(img_path)
tree = ET.parse(xml_path)
root = tree.getroot()
<span class="hljs-keyword">for</span> box <span class="hljs-keyword">in</span> root.iter(<span class="hljs-string">'bndbox'</span>):
xmin = float(box.find(<span class="hljs-string">'xmin'</span>).text)
ymin = float(box.find(<span class="hljs-string">'ymin'</span>).text)
xmax = float(box.find(<span class="hljs-string">'xmax'</span>).text)
ymax = float(box.find(<span class="hljs-string">'ymax'</span>).text)
x, y, w, h = rotate_xml(src, xmin, ymin, xmax, ymax, angle)
<span class="hljs-comment"># 改变xml中的人脸坐标值</span>
box.find(<span class="hljs-string">'xmin'</span>).text = str(x)
box.find(<span class="hljs-string">'ymin'</span>).text = str(y)
box.find(<span class="hljs-string">'ymax'</span>).text = str(x+w)
box.find(<span class="hljs-string">'ymax'</span>).text = str(y+h)
box.set(<span class="hljs-string">'updated'</span>, <span class="hljs-string">'yes'</span>)
<span class="hljs-comment"># 写入新的xml</span>
tree.write(<span class="hljs-string">"/home/username/xml/"</span> + a + <span class="hljs-string">"_"</span> + str(angle) +<span class="hljs-string">".xml"</span>)
<span class="hljs-keyword">print</span> <span class="hljs-string">"[%s] %s is processed."</span> % (angle, i)</code><ul class="pre-numbering" style="opacity: 0;"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li><li>93</li><li>94</li><li>95</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li><li>93</li><li>94</li><li>95</li></ul></pre>
<h2 id="3结果"><a name="t2" target="_blank"></a>3、结果</h2>
<p>我们来看下旋转后的图像和修改后的.xml文件 <br>
太多了,这里只放两张~ <br>
<img src="https://img-blog.csdn.net/20161123133858076" alt="这里写图片描述" title=""> <img src="https://img-blog.csdn.net/20161123133910139" alt="这里写图片描述" title=""> <br>
修改后的xml文件如下</p>
<pre class="prettyprint" name="code"><code class="hljs xml has-numbering"><span class="hljs-tag"><<span class="hljs-title">annotation</span>></span>
<span class="hljs-tag"><<span class="hljs-title">object</span>></span>
<span class="hljs-tag"><<span class="hljs-title">name</span>></span>face<span class="hljs-tag"></<span class="hljs-title">name</span>></span>
<span class="hljs-tag"><<span class="hljs-title">difficult</span>></span>0<span class="hljs-tag"></<span class="hljs-title">difficult</span>></span>
<span class="hljs-tag"><<span class="hljs-title">bndbox</span> <span class="hljs-attribute">updated</span>=<span class="hljs-value">"yes"</span>></span>
<span class="hljs-tag"><<span class="hljs-title">xmin</span>></span>460<span class="hljs-tag"></<span class="hljs-title">xmin</span>></span>
<span class="hljs-tag"><<span class="hljs-title">ymin</span>></span>521<span class="hljs-tag"></<span class="hljs-title">ymin</span>></span>
<span class="hljs-tag"><<span class="hljs-title">xmax</span>></span>693.677419<span class="hljs-tag"></<span class="hljs-title">xmax</span>></span>
<span class="hljs-tag"><<span class="hljs-title">ymax</span>></span>849<span class="hljs-tag"></<span class="hljs-title">ymax</span>></span>
<span class="hljs-tag"></<span class="hljs-title">bndbox</span>></span>
<span class="hljs-tag"></<span class="hljs-title">object</span>></span>
<span class="hljs-tag"></<span class="hljs-title">annotation</span>></span></code><ul class="pre-numbering" style="opacity: 0;"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul></pre>
<p>效果怎么样呢?我们来写个小程序看一下</p>
<pre class="prettyprint" name="code"><code class="language-python hljs has-numbering"><span class="hljs-keyword">import</span> cv2
<span class="hljs-keyword">import</span> os
<span class="hljs-keyword">import</span> xml.etree.ElementTree <span class="hljs-keyword">as</span> ET
<span class="hljs-keyword">import</span> pdb
<span class="hljs-keyword">for</span> img <span class="hljs-keyword">in</span> os.listdir(<span class="hljs-string">"/home/mi/rotate/"</span>):
a, b = os.path.splitext(img)
<span class="hljs-keyword">if</span> b == <span class="hljs-string">".jpg"</span>:
img = cv2.imread(<span class="hljs-string">"/home/yourname/rotate/"</span> + img)
tree = ET.parse(<span class="hljs-string">"/home/yourname/xml/"</span> + a + <span class="hljs-string">".xml"</span>)
root = tree.getroot()
<span class="hljs-keyword">for</span> box <span class="hljs-keyword">in</span> root.iter(<span class="hljs-string">'bndbox'</span>):
x1 = float(box.find(<span class="hljs-string">'xmin'</span>).text)
y1 = float(box.find(<span class="hljs-string">'ymin'</span>).text)
x2 = float(box.find(<span class="hljs-string">'xmax'</span>).text)
y2 = float(box.find(<span class="hljs-string">'ymax'</span>).text)
x1 = int(x1)
y1 = int(y1)
x2 = int(x2)
y2 = int(y2)
cv2.rectangle(img, (x1, y1), (x2, y2), [<span class="hljs-number">0</span>,<span class="hljs-number">255</span>,<span class="hljs-number">0</span>], <span class="hljs-number">2</span>)
cv2.imshow(<span class="hljs-string">"test"</span>, img)
<span class="hljs-keyword">if</span> <span class="hljs-number">1</span> == cv2.waitKey(<span class="hljs-number">0</span>):
<span class="hljs-keyword">pass</span></code><ul class="pre-numbering" style="opacity: 0;"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li></ul></pre>
<p><img src="https://img-blog.csdn.net/20161123134058734" alt="这里写图片描述" title=""> <img src="https://img-blog.csdn.net/20161123133656970" alt="这里写图片描述" title=""></p>
<hr>
<p>(end)</p></div>
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul></ul>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li></li>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
</div>
TF数据增强
猜你喜欢
转载自blog.csdn.net/judyqing/article/details/77833413
今日推荐
周排行