问题描述
我想实现一种能够使用 OpenCV 3.0.0 的 C api 比较两个图像的算法。 图像由网络摄像头捕获,因此它们具有相同的分辨率(不用担心很小)和相同的文件格式(jpeg)(但我们可以根据需要更改它) 我的想法是获得两个图像,在黑白中进行转换,并使用简单的构造比较一点一点。 在 b&w 中,我们可以将图像视为具有 0 和 1 的完整矩阵。 示例:
Image1(黑白)
- 0 0 0 1
- 0 1 0 1
- 0 0 0 0
- 0 0 1 1
所以我知道用 opencv 有很多方法可以做到,但我读了很多对我来说没用的例子。
所以我的想法是手动操作每个像素。将图像视为一个矩阵,我们可以使用简单的 double 结构(pixel_image[r:rows][c:columns] == pixel_image2[r:rows][c:columns] 仅当“像素”是被认为是整数。所以问题是我如何从 IplImage 类型访问像素的值?
当然这样我认为我的代码优化不好,或者我可能无法适应大规模的图像数据。
(请不要回答我:“使用 c++ - 使用 python - c 已被弃用 ecc ..”,我知道有很多方法可以使用高级代码以简单的方式做到这一点)
谢谢大家。
解决方法
好的,我解决了。 这样你就可以访问单个像素的值(如果图像加载为 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,j).val[1];
tmpr=cvGet2D(img,j).val[2];
}
}
如果图像是单通道(例如如果我们将其转换为黑白)是
IplImage* img=cvCreateImage(cvSize(640,3);
int tmp
for(int i=0;i<img->height;i++){
for(int j=0;j<img->width;j++){
tmp=cvGet2D(img,j).val[0];
printf("Value: %d",tmp);
}
}