【问题标题】:How to compare two image with c如何将两个图像与c进行比较
【发布时间】:2021-06-02 08:56:03
【问题描述】:

我想使用 OpenCV 3.0.0 的 C api 实现一种能够比较两个图像的算法。 图像由网络摄像头捕获,因此它们具有相同的分辨率(不要担心很小)和相同的文件格式(jpeg)(但我们可以根据需要更改它) 我的想法是获取两个图像,以黑白方式转换,并使用简单的 for 构造逐位比较。 在 b&w 中,我们可以将图像视为具有 0 和 1 的完整矩阵。 示例:

Image1(黑白)

  • 0 0 0 1
  • 0 1 0 1
  • 0 0 0 0
  • 0 0 1 1

所以我知道使用 opencv 有很多方法可以做到这一点,但我阅读了很多对我无用的示例。 所以我的想法是手动操作每个像素。将图像视为一个矩阵,我们可以通过一个简单的双精度构造(pixel_image[r:rows][c:columns] == pixel_image2[r:rows][c:columns] 仅当“像素”为被视为整数。所以问题是如何从 IplImage 类型中访问像素的值?
当然,这样我认为我的代码优化不好,或者我无法适应大规模的图像数据。

(请不要回答我:“使用 c++ - 使用 python - c 已弃用 ecc..”,我知道有很多方法可以通过高级代码轻松完成)

谢谢大家。

【问题讨论】:

  • 逐像素比较不会给您任何满意的结果。想象一幅由一个像素宽度的垂直黑白条纹组成的图像。现在认为在其中一张图像上它向左移动了一个像素。没什么大不了的,对吧?但是你的算法会认为这两张图片有最大的不同。
  • 是的,我知道,确实我会以百分比形式插入一种阈值错误(仅当我使用我的算法时)。所以问题是一样的,我如何从 IplImage 类型中访问像素值? @EugeneSh。

标签: c image opencv compare iplimage


【解决方案1】:

好的,我解决了。 这样你就可以访问单个像素的值(如果图像加载为 RGB)(记住 opencv 看到 BGR)

IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);
double tmpb,tmpg,bmpr;
for(int i=0;i<img->height;i++){
    for(int j=0;j<img->width;j++){
        tmpb=cvGet2D(img,i,j).val[0];
        tmpg=cvGet2D(img,i,j).val[1];
        tmpr=cvGet2D(img,i,j).val[2];
    }
}

如果图像是单通道(例如,如果我们将其转换为黑白)是

IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);
int tmp 
for(int i=0;i<img->height;i++){
    for(int j=0;j<img->width;j++){
        tmp=cvGet2D(img,i,j).val[0];
        printf("Value: %d",tmp);
    }
}

【讨论】:

    猜你喜欢
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    • 2019-05-21
    • 1970-01-01
    • 2019-04-16
    • 2014-04-01
    • 2015-01-23
    相关资源
    最近更新 更多