主要有4点总结:
1.
读取txt的内容(文件路径),按行输出。下面语句中,pictures.txt中是文件夹中的文件(图片)列表,samplePath是文件夹路径(string格式)。string和char类型可以使用‘+’连接。
<code class="hljs ocaml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">char</span> positiveImgName[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">256</span>]; fream f; f.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">open</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"D:\\pictures.txt"</span>,ios::<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span>); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (!f.eof()) { f.getline(positiveImgName,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">256</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'\n'</span>); <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">string</span> picturePath=samplePath+positiveImgName; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>
2.
对于某些样本照片,可能大小不如我们所愿,因此要对其进行截取。
我们可以从Mat类型中提取矩形区域:
<code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">cv:</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:Mat</span> bigImage=<span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">cv:</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:Mat</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:zeros</span>(<span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">cv:</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:Size</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">660</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">350</span>)); <span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">cv:</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:Mat</span> smallImage=<span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">cv:</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:Mat</span>(bigImage,<span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">cv:</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:Rect</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">110</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">70</span>));</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>
但是,需要注意这么做并没有复制图像数据,仅仅为同样的image data创建了另一个wrapper。如果需要复制数据,需要用:
<code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">cv:</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:Mat</span> smallImage = <span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">cv:</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:Mat</span>(bigImage, <span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">cv:</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:Rect</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">110</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">70</span>)).clone();</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
如果需要图像中多个不同大小的部分,需要将图像用网格划分,比如:
<code class="hljs cpp has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">cv::Size smallSize(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">110</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">70</span>); <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-stl_container" style="box-sizing: border-box;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">vector</span><Mat></span> smallImages; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> y = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; y < bigImage.rows; y += smallSize.height) { <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> x=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; x < bigImage.cols; x += smallSize.width) { cv::Rect rect =cv::Rect(x,y,smallSize.width, smallSize.height); smallImages.push_back(cv::Mat(bigImage, rect)); } }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li></ul>
在图像处理中,样本的处理需要使用第二中复制数据的方式。
3.
使用dir\b>picture.lst命令行获取一个文件夹内所有文件的文件名,会在文档的最后多产生一个空行。
4.
训练出来的SVM classifier的support vector是以Mat类型进行存储,其rows是根据svm的参数而变化的,如果是二分类分类器,应该是1*n的大小。如果和规划的不一致,去查看训练数据是否有误(是否有些label未赋值等)。