图像处理调试(二十六)

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

                          (0)

                          相关推荐