在 OpenCV 上使用 SVM 训练图像

2024-01-02

我正在尝试对图像进行分类(下一步我将根据特征进行分类,但现在只想尝试我是否做得对)

这是我的代码。

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/ml/ml.hpp>

using namespace cv;
using namespace std;



int main(){


    Mat image[2];
    image[0]= imread("image.jpg",0);

    image[1]= imread("wrongimage.jpg",0);

    Mat rotated = imread("image.jpg",0);


    image[0] = image[0].reshape(0, 1); //SINGLE LINE
    image[1] = image[1].reshape(0, 1); //SINGLE LINE


    //  image[0].convertTo(image[0], CV_32FC1); //CONVERT TO 32FC1
    //  image[1].convertTo(image[1], CV_32FC1); //CONVERT TO 32FC1


    Mat new_image(2,1,CV_32FC1,image); //CONVERT TO 32FC1



    float labels[2] = {1.0, -1.0};
    Mat labelsmat(2,1,CV_32FC1,labels); //correct labels 1

    labelsmat.convertTo(labelsmat, CV_32FC1);



    CvSVMParams params;
    params.svm_type = CvSVM::C_SVC;
    params.kernel_type = CvSVM::LINEAR;
    params.gamma = 3;
    params.degree = 3;
    CvSVM svm;
    svm.train(new_image, labelsmat, Mat(),Mat(),params);

    //    svm.train(training_mat2, labelsmat, Mat(),Mat(),params);

    // svm.train(training_mat2, labelsmat, Mat(), Mat(), params);
    svm.save("svm.xml"); // saving


    svm.load("svm.xml"); // loading


    rotated = rotated.reshape(0,1);
    rotated.convertTo(rotated, CV_32FC1);


     svm.predict(rotated);
}

由于使用 opencv svm 训练图像缺乏记录,我尝试通过阅读来管理某些内容使用 OpenCV 和 SVM 处理图像 https://stackoverflow.com/questions/14694810/using-opencv-and-svm-with-images and http://docs.opencv.org/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html http://docs.opencv.org/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html

不知何故,我设法训练我的图像,但我强烈认为这个训练 xml 文件不正确,因为我没有指出哪个图像是正确的 (1) 或错误的 (-1)

而且当我尝试用我训练过的 svm 图像进行预测时,也会出现错误

OpenCV 错误:输入参数的大小不匹配(样本大小 与训练中使用的不同) cvPreparePredictData,文件 /tmp/opencv-DXLLi8/opencv-2.4.9/modules/ml/src/inner_functions.cpp, 第 1114 行 libc++abi.dylib:以未捕获的类型异常终止 简历::例外: /tmp/opencv-DXLLi8/opencv-2.4.9/modules/ml/src/inner_functions.cpp:1114: 错误:(-209) 样本大小与所使用的不同 函数 cvPreparePredictData 中的训练

这里也是由 SVM 生成的 xml。

<?xml version="1.0"?>
<opencv_storage>
<my_svm type_id="opencv-ml-svm">
  <svm_type>C_SVC</svm_type>
  <kernel><type>LINEAR</type></kernel>
  <C>1.</C>
  <term_criteria><epsilon>1.1920928955078125e-07</epsilon>
    <iterations>1000</iterations></term_criteria>
  <var_all>1</var_all>
  <var_count>1</var_count>
  <class_count>2</class_count>
  <class_labels type_id="opencv-matrix">
    <rows>1</rows>
    <cols>2</cols>
    <dt>i</dt>
    <data>
      -1 1</data></class_labels>
  <sv_total>1</sv_total>
  <support_vectors>
    <_>
      -1.56709105e-02</_></support_vectors>
  <decision_functions>
    <_>
      <sv_count>1</sv_count>
      <rho>-1.</rho>
      <alpha>
        1.</alpha>
      <index>
        0</index></_></decision_functions></my_svm>
</opencv_storage>

UPDATE

我已经根据建议更改了我的代码古奈凯伊姆但现在我得到了 EXC_BAD_ACCESS(代码=1 地址=...)错误。我更新的代码如下。

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/ml/ml.hpp>

using namespace cv;
using namespace std;



int main(){


    Mat image[2];
    image[0]= imread("image.jpg",0);

    image[1]= imread("wrongimage.jpg",0);

    Mat rotated = imread("image.jpg",0);


   image[0] = image[0].reshape(0, 1); //SINGLE LINE
   image[1] = image[1].reshape(0, 1); //SINGLE LINE

 //   int size = sizeof(image)/sizeof(Mat);
    //  image[0].convertTo(image[0], CV_32FC1); //CONVERT TO 32FC1
    //  image[1].convertTo(image[1], CV_32FC1); //CONVERT TO 32FC1

    Mat new_image(2,341318,CV_32FC1,image); //CONVERT TO 32FC1

    float labels[2] = {1.0, -1.0};
    Mat labelsmat(2,1,CV_32FC1,labels); //correct labels 1

    labelsmat.convertTo(labelsmat, CV_32FC1);


    cout<<image[0].size()<<endl;
    cout<<new_image.size()<<endl;



    CvSVMParams params;
    params.svm_type = CvSVM::C_SVC;
    params.kernel_type = CvSVM::LINEAR;
    params.gamma = 3;
    params.degree = 3;
    CvSVM svm;
    svm.train_auto(new_image, labelsmat,Mat(),Mat(),params);

    //  svm.train_(new_image, labelsmat, Mat(),Mat(),params);
    //    svm.train(training_mat2, labelsmat, Mat(),Mat(),params);

    // svm.train(training_mat2, labelsmat, Mat(), Mat(), params);
    svm.save("svm.xml"); // saving


    svm.load("svm.xml"); // loading


    rotated = rotated.reshape(0,1);
    rotated.convertTo(rotated, CV_32FC1);

    cout<<svm.predict(rotated)<<endl;

}

我的图像尺寸是:[170569 x 1] new_image 大小为 [341318 x 2]


有几件事你做错了,或者你没有意识到自己在做。

  1. 您说您没有指出哪个图像是正确的(1)或错误的(-1),但您使用了以下行:float labels[2] = {1.0, -1.0};
  2. 您创建的训练集是错误的。假设你的图像是640x480大小。然后当你重塑它们时,它们将是307200大小的向量,这很好。所以,你的训练集,你称之为new_image, 应该2x307200大小,每行应代表一个图像,但您正在创建 2x1 大小的训练集。这就是为什么当您尝试预测时会收到错误消息:Sizes of input arguments do not match。您训练了 SVM2x1大小的训练集并尝试预测1x307200 vector.

除此之外,你不应该使用幻数来设置SVM参数,你需要通过交叉验证来优化它们。当然,在这个玩具示例中你不能进行参数优化,我想说的是你应该意识到设置 SVM 参数是一项非常关键的任务。

我已经回答了几个关于SVM的问题,你可以到我的个人资料中查看。

希望这可以帮助。

UPDATE

您可以检查您是否正在创建new_image通过以下代码更正:

Mat image[2];
image[0]= imread("image.jpg",0);
image[1]= imread("wrongimage.jpg",0);

// dont reshape them for debugging purposes...
//image[0] = image[0].reshape(0, 1); //SINGLE LINE
//image[1] = image[1].reshape(0, 1); //SINGLE LINE

// I assume that images are 640x480, change the value accordig to the image sizes, or directly use values in the size parameter
Mat new_image(1280, 480, CV_32FC1, image); //CONVERT TO 32FC1

// visualize the image see if the previous line of code does its job correctly.
imshow("new_image", new_image);

UPDATE 2

您需要创建单个cv::Mat反对你的cv::Mat大批。显然,下面的行无法正确执行此操作。

Mat new_image(2,341318,CV_32FC1,image); 

找到一个合适的方法来做到这一点,目前我没有安装OpenCV环境,你基本上可以问另一个关于它的问题。

记住,你的new_image变量应该是[image_count * (image_width * image_height)]大小,每行应将图像向量表示为1 * (image_width * image_height) sized.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 OpenCV 上使用 SVM 训练图像 的相关文章

  • 我的 Opencv 应用程序处理速度非常慢

    我正在构建一个 OpenCV 应用程序 它从相机捕获视频 并在删除背景后将其覆盖在另一个视频上 我无法达到合理的速度 因为它以大约 1 fps 的速度播放输出 而我的背景去除以 3 fps 的速度工作 有没有办法以正常速度显示背景视频并以
  • Opencv 对象检测:ORB GPU 检测器和 SURF GPU 描述符提取器

    我只是做了一个小实验来尝试不同的检测器 描述符组合 我的代码使用 ORB GPU 检测器来检测特征 并使用 SURF GPU 描述符来计算描述符 我使用 BruteForceMatcher GPU 来匹配描述符 并使用 knnMatch 方
  • 静态 OpenCV 库中未定义的引用

    我有一个使用 OpenCV 3 1 的 C 项目 并且使用共享库可以正常工作 但现在我想使用静态库 位于项目目录中的文件夹中 来编译它 因为我希望能够在未安装 OpenCV 的情况下导出它 如果需要还可以编辑和重新编译 这次我重新编译了 O
  • 在 Tensorflow-lite Android 中将位图转换为 ByteBuffer(浮点)

    在用于图像分类的tensorflow lite android演示代码中 图像首先转换为ByteBuffer格式以获得更好的性能 这种从位图到浮点格式的转换以及随后到字节缓冲区的转换似乎是一个昂贵的操作 循环 按位运算符 float mem
  • 如何获取 sklearn.metrics.classification_report 的输出作为字典?

    我一直在尝试以字典的形式获得分类报告 所以根据 scikit learn 0 20 文档 我这样做 from sklearn import metrics rep metrics classification report y true y
  • Haar级联正例图像大小调整

    我正在迈出第一步 为自定义对象识别创建 haar 级联 我花了时间获取大量数据并编写了一些预处理脚本以将视频转换为帧 我的下一步是裁剪感兴趣的对象 以创建一些积极的训练示例 我有几个问题 我确实在网上寻找答案 我有点困惑 我读到我应该致力于
  • 在 virtualenvwrapper 中激活环境

    我安装了virtualenv and virtualenvwrapper用这个命令我创建了一个环境 mkvirtualenv cv 它有效 创建后我就处于新环境中 现在我重新启动了我的电脑 我想activate又是那个环境 但是怎么样 我使
  • OpenCV 地板分割检测

    我正在研究一种检测图像中地板的方法 我试图通过将图像缩小为颜色区域然后假设最大区域是地板来实现此目的 我们对机器人的运行环境做出一些相当广泛的假设 我正在寻找一些关于适合这个问题的算法的建议 任何帮助将不胜感激 编辑 具体来说 我正在寻找一
  • OpenCV功能类似于matlab的“查找”

    我正在寻找 openCV 中的一个函数来帮助我制作图像蒙版 例如在 MATLAB 中 B A or B 零 大小 A B A 10 c 有些功能可以让你通过mask向他们提出论据 按照您描述的方式创建面具 我认为您正在追求Cmp 或 Cmp
  • 如何从一个清晰的例子计算二维图像中的吉布斯能量

    我有一个关于矩阵的有趣问题 在吉布斯分布中 吉布斯能量U x 可以计算为 这是所有可能的派系 C 上的派系势 Vc x 的总和 右图 团 c 被定义为 S 中站点的子集 x 蓝色像素的邻域是左图中黄色像素的邻居 其中每对不同的站点都是邻居
  • CV_MAT_ELEM 中的编译错误

    调用estimateRigidTransform 的结果是我得到一个名为 trans 的cv Mat 对象 为了检索其包含的矩阵 我尝试以这种方式访问 其元素 for i 0 i lt 2 i for j 0 j lt 3 j mtx j
  • 从基本矩阵中查找单应矩阵

    我正在尝试计算单应性矩阵H给定一组对应关系和基本矩阵F 根据对极几何原理 我知道这可以通过对极线和对极线的叉积来完成F from 极点几何 http www cs unc edu marc tutorial node44 html e ij
  • 使用Python对图像进行反转和平移

    我编写了以下代码来循环遍历文件夹中的所有图像 创建其底片并将其保存在新的相似名称下 我怎样才能做同样的事情来将它们向右平移 5 个像素 Code from PIL import Image import PIL ImageOps impor
  • HTC One M8 - 使用第二个后置摄像头

    我有一台 HTC One M8 设备 它有 2 个后置摄像头和一个额外的前置摄像头 我的问题是尝试访问第二个后置摄像头 我已经成功制作了一个应用程序 它同时运行 2 个摄像头 1 个前置摄像头和 1 个后置摄像头 但问题是我无法访问第二个后
  • 如何在 MATLAB 的 for 循环中读取多个图像?

    我已将结果分段放在一个文件夹中 这些需要在 for 循环中读取并在循环中进一步处理 我尝试阅读如下 for i 1 10 file name dir strcat C Users adminp Desktop dinosaurs im im
  • OpenCV findContours() 仅返回一个外部轮廓

    我试图隔离验证码中的字母 我设法过滤验证码 结果是这个黑白图像 但是当我尝试使用 OpenCV 的 findContours 方法分离字母时 它只是发现了一个包裹整个图像的外部轮廓 从而产生了该图像 图像外部的黑色轮廓 我将此代码与 Pyt
  • 使用 OpenCV 描述符与 findFundamentalMat 匹配

    我之前发布了有关同一程序的问题 但没有收到答案 我已经纠正了当时遇到的问题 但又面临新的问题 基本上 我使用未校准的方法自动校正立体图像对的旋转和平移 我使用 SURF 等特征检测算法来查找两个图像 左右立体图像对 中的点 然后再次使用 S
  • 如何计算 cv::Mat 的步幅

    我想知道如何计算步幅cv Mat 我已经更新了代码 我需要计算步幅 我不知道计算投影变换有什么问题 我得到一个cv Mat然后将其复制到unsigned int数组 然后对其进行转换 然后返回一个cv Mat待展示 cv Mat3b src
  • 在谷歌C​​olab中使用cv2.imshow()

    我正在尝试通过输入视频来对视频进行对象检测 cap cv2 VideoCapture video3 mp4 在处理部分之后 我想使用实时对象检测来显示视频 while True ret image np cap read Expand di
  • 敏感性特异性图 python

    我正在尝试重现类似于此的灵敏度特异性图 其中 X 轴是阈值 但我还没有找到如何做到这一点 一些 skalern 指标 如 ROC 曲线 会返回真阳性和假阳性 但我还没有找到任何选项来制作此图 我试图将概率与实际标签进行比较以保持计数 我得到

随机推荐

  • Linq:如何按一个表的 SUM 和另一个表的 COUNT 进行排序

    根据一个上一个问题 https stackoverflow com questions 4718113 linq orderby sum of multiple fields 我有以下 LINQ 表达式 Events Where Funct
  • 可以在闪亮的用户界面中显示控制台消息(用“消息”编写)吗?

    我不太了解 R 的消息 猫 打印 等等 但我想知道是否可以捕获消息并在闪亮的应用程序中显示它们 示例 以下应用程序可以捕获 cat 语句 以及 print 语句 但不能捕获 message 语句 runApp shinyApp ui flu
  • Conda报告有冲突,但似乎没有冲突

    我一直在努力更新pyqt到最新版本 但由于包冲突而失败 我尝试更新的包在这里似乎无关紧要 从我最后附上的以下消息可以明显看出 glibc已安装版本 2 35 所有包都需要glibc2 17 或更高版本 所以没有冲突 但是拒绝安装 那么 这个
  • HTTP 管道 - 每个连接并发响应

    我刚刚读到这个维基百科文章 http en wikipedia org wiki HTTP pipelining在 HTTP 管道上 从图中可以看出 响应可以在一个连接上同时发送 我是否误解了该图或者这是允许的 RFC 2616 第 8 1
  • 转发引用的右值

    我正在读参考折叠规则 http thbecker net articles rvalue references section 08 html我有一个问题 为什么如果我通过了rvalue A to template
  • 与 Azure AD/B2C 用户一起保护 API

    我的用例是 通过 API 使用自定义字段创建用户 使用任何电子邮件地址指定密码 通过 API 更新 禁用这些用户 通过 REST API 使用用户详细信息 登录 Azure AD 应用程序以获取令牌 当 Http 标头中传递令牌时 向 We
  • Cloud Storage python 客户端无法检索存储桶

    我正在尝试使用 python 客户端库将 blob 写入云存储 我正在使用的虚拟机具有存储的读 写权限 并且我可以通过 gsutil 访问存储桶 但是 python 给出以下错误 gt gt gt from google cloud imp
  • 如何在 Cassandra(特别是 CQLSH)中将字符串或文本作为 blob 插入?

    我试图在 CQLSH 中将文本或某些字符串作为 blob 插入以进行测试 insert into test by score commit delta test score values textAsBlob bdb14fbe076f6b9
  • Spring+JPA @Transactional 未提交

    我知道以前曾在这里问过类似的问题 但我找不到问题的解决方案 基本上 我试图在 Spring 中通过 Hibernate 使用 JPA 但数据是not由于某种原因而被持久化 在 spring 事务上打开调试没有显示任何内容 EntityMan
  • Chrome 开发者工具中 Javascript 旁边的列中显示的时间是多少?

    显然与函数执行的时间长短有关 它具体代表什么 前任 如果该函数在执行过程中被多次调用 则使用什么值 它确实应该是每行花费的总时间的细分 如果多次调用某行 您看到的值是该行总共花费的时间之和 我同意逐行细分有时确实会产生一些奇怪的结果 我会进
  • 我应该使用对象初始值设定项还是构造函数? [复制]

    这个问题在这里已经有答案了 我刚刚了解了对象初始值设定项 并且想知道何时使用它们的最佳实践是什么 这是我读到的关于他们的内容 http msdn microsoft com en us library vstudio bb384062 as
  • 如何隐藏图像按钮?

    我有 1 个 imageButton 我想在 oncreate 方法中 5 秒后隐藏该按钮 谁能帮帮我吗 onCreate new SleepTask execute private class SleepTask extends Asyn
  • 从 C# POCO 类代码生成 Winforms 表单

    是否已经在某处编写了一些开源代码 该代码将接受具有属性和验证属性的类 并输出带有与这些属性相对应的控件的 Windows 窗体 例子 public bool IsRed get set 产生一个带有Is Red label public i
  • Silverlight:如何设置验证工具提示的样式?

    我做了一些搜索 但这不是我要找的 那么 有谁知道如何在 Silverlight 中设置验证工具提示的样式 绿色边框中的东西 替代文本 http img689 imageshack us img689 222 validationtoolti
  • 获取CPU或主板序列号?

    我正在尝试获取CPU serial or motherboard serial using C or Python出于许可目的 是否可以 我在用着Linux 在 Linux 下 您可以使用 lshw quiet xml 并解析其输出 您将在
  • keras 和 tf.keras 模型之间的兼容性

    我有兴趣在 tf keras 中训练模型 然后用 keras 加载它 我知道这不是强烈建议 但我有兴趣使用 tf keras 来训练模型 因为 tf keras 更容易构建输入管道 我想利用 tf dataset API 我有兴趣用 ker
  • 为 Spring Boot 实现字节服务

    我想使用 Spring Boot Rest API 在 Angular 中实现视频播放器 我可以播放视频 但无法进行视频搜索 每次当我使用 Chrome 或 Edge 时 视频都会一遍又一遍地开始 我尝试了这个端点 RequestMappi
  • PHP PDO 获取 MySQL 日期时间

    我有一个代表 MySQL 表的 PHP 类 其中一种列表类型是DateTime 以前我使用字符串并且一切正常 因为我不必处理日期类型 我只是用fetchAll函数和列表自动映射到适当的字段 stmt gt execute results s
  • 使用 GAE Python 第二代在本地运行

    我已经使用 GAE P 第一代很多年了 现在正在跳转到我的第一个 GAE P 第二代项目 我正在尝试像我一样在本地运行它dev appserver py对于第一代应用程序 但是the docs https cloud google com
  • 在 OpenCV 上使用 SVM 训练图像

    我正在尝试对图像进行分类 下一步我将根据特征进行分类 但现在只想尝试我是否做得对 这是我的代码 include