图像处理调试(二十六)
1、imread用法要清楚,欲哭无泪!
Mat dstImage = imread('466_1.bmp',0);//图像1
2、读取程序执行时间功能
#include <time.h> clock_t start_time1 = clock(); clock_t end_time1 = clock(); double processTime1 = static_cast<double>(end_time1 - start_time1) / CLOCKS_PER_SEC * 1000;
3、Vector 越界
vector subscript out of range 是指vector下标越界,一般都是遍历下标出错导致越界访问。一般情况是手一滑就把循环边界写错。当然也有出乎意料的出错地方。
对vector进行遍历的时候经常这么写:
vector<int>a;
//a.push_back(2);
//...
for(int i=0;i<a.size();i++)
{
//a[i]
}
这里注意一点,a.size()是一个无符号整数,更加规范的写法是把i定义为size_t类型,也就是无符号整数。
出乎意料的情况:
for( size_t i = 0; i <= v.size()-1; i++) { cout<<v[i]<<endl; }
若v.size()=0,也会出现下标越界,因为size=0,则size-1=-1,则此时二进制位全为1,但size-1是一个无符号整数,则变为0−2320−232范围的无符号整数,则其值为232232,所以上述代码在vector.size=0时会出现下标越界访问,当然一般size里不会等于0,但是若是出现在不停迭代变化的场景下如此写必然会出现错误。
预防方法:
可以在vector遍历时利用if添加对下标的检测,若出现错误则格外注意对于循环中设定的上下界进行输出检查。可以避免对未知内存访问以及更快定位出现错误的地方。
vector<int >v;
for (size_t i = 0; i <= v.size() - 1; i++)
{
if (i >= v.size() || i < 0) { cout << 'vetcor下标越界' << endl; break; }
cout << v[i] << endl;
}
4、遍历文件夹图像进行测试
(1)cmd下运行dir face_100 /b > sam.txt可以批量的生成文件名,保存在sam.txt,然后按行读取,加目录路径组成文件路径,就可以循环读了。
(2)glob遍历文件夹下的所有图片
#include <opencv2\opencv.hpp>#include <iostream>using namespace std;using namespace cv;int main(){ //要绝对路径 string path = 'D:\\data\\*.bmp'; cout << path << endl; vector<Mat> images; // 必须cv的String vector<String> fn; glob(path, fn, false); size_t count = fn.size(); cout << count << endl; for (int i = 0; i < count; i++) { images.push_back(imread(fn[i])); imshow('pic', images[i]); waitKey(10); } return 0;}
(3)
#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
using namespace cv;
using namespace std;
int main() {
std::string pattern_jpg = 'D:\\Photo and Video\\destop1\\*.jpg';
std::vector<cv::String> image_files;
cv::glob(pattern_jpg, image_files);
if (image_files.size() == 0) {
std::cout << 'No image files[jpg]' << std::endl;
return 0;
}
for (unsigned int frame = 0; frame < image_files.size(); ++frame) {//image_file.size()代表文件中总共的图片个数
Mat image = cv::imread(image_files[frame]);
imshow('1', image);
waitKey(30);
}
5、Matlab 循环读取图像
循环读取图片第一种方法
List =dir('*.jpg'); %如需其它图片格式支持,可以自己【重载dir()】函数,实现查找所有图片文件的功能,%如果图片是其它路径,可以用 ['路径' '.扩展名'] 字符串来实现。k =length(dList);for i=1:1:kimage_data{i}=imread(dList(i).name);end
第二种方法
I=ones(8,5);
q=reshape(49:56,8,1);
I(:,1)=q;
I(:,2)='.';
I(:,3)='b';
I(:,4)='m';
I(:,5)='p';
L=setstr(I); %将ASCII码转为字符串;
第三种方法
images= [ ];fo r i= 1:Mstr= strcat ('D: \MATLAB\work\', int2str(i) , ’.bmp’) ; % 连接字符串形成图像的文件名。img= imread(str);[rows cols]= size(img) ; % 获得图像的行和列值。temp= reshape ( img, rows*cols, 1) ; % 创建一个(N1*N2)×1 矩阵。images= [ images temp ]; % 完成循环后的images 矩阵是一个(N 13 N 2) ×M 矩阵。end
上述三种方法中,第一种主要利用dir()函数,获得文件夹内图片的信息,然后创建一个元胞数组,将图片文件信息送入元胞数组
第二种方法是已知图片文件名,并且按数字顺序排列,然后利用数字和字符串之间的转换来进行。
第三种方法利用字符串连接函数strcat()函数巧妙运用循环实现图片的连续读入。
6、
求数组的极大值
int a[5] = { 1, 2, 3, 0, -20 };
printf(' %d', *max_element(a, a + 5));
printf(' %d\n', *min_element(a, a + 5));
求vector极大值,极小值
b_row.push_back(col_num / v_row.size());auto maxPosition = max_element(b_row.begin(), b_row.end());auto minPosition = min_element(b_row.begin(), b_row.end());ROW_max = *maxPosition;ROW_min = *minPosition;
7、
“LNK1123:转换到 COFF期间失败:文件无效或损坏”的解决方法
一、错误描述
之前写的程序隔段时间使用VS2010再次运行时出现如下错误:
LINK fatal error LNK1123转换到 COFF期间失败文件无效或损坏
二、解决方法
百度了一下此问题的解决方法,逐个试了一下发现有些顽固,并没有一次成功,所以将整个步骤结合自己的处理总结如下。
1.修改项目属性
项目—属性—配置属性—清单工具—输入输出—嵌入清单,改为“否”
大部分方法说这种处理应该可以解决,但每次新建工程都需要如此配置。如果发现问题仍未解决,那么可以尝试一下两种方法。
2.用新版cvtres.exe替换旧版本的cvtres.exe
由于连接器LNK是通过调用cvtres.exe完成文件向coff格式的转换的,所以出现这种错误的原因就是cvtres.exe出现了问题。搜索本机C盘cvtres.exe找到如下结果:
使用C:\Windows\winsxs文件夹中的较新版“cvtres.exe”替换掉..\Microsoft Visual Studio 10.0\VC\bin中的同名文件,如不放心可以将原文件改名为“cvtres1.exe”,如下图所示。
3.直接删除旧版本的cvtres.exe
如问题仍未解决,可以将Microsoft Visual Studio 10.0\VC\bin中的cvtres.exe直接删除或改名后不要复制新版的cvtres.exe进入该文件夹。
再次运行程序,问题解决。
参考文献:
https://blog.csdn.net/huoguangyao/article/details/80274260
https://blog.csdn.net/iracer/article/details/51138135