'foreground_regions' 问题

本文解决了在编译OpenCV时遇到的关于'foreground_regions'成员变量不存在的问题,通过修复cvaux.h文件中的注释错误使编译通过。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

报错如下:

C:/Program Files/OpenCV/cvaux/src/cvbgfg_acmmm2003.cpp(411) : error C2039: 'foreground_regions' : is not a member of 'CvFGDStatModel'
../../cvaux/include/cvaux.h(1240) : see declaration of 'CvFGDStatModel'
C:/Program Files/OpenCV/cvaux/src/cvbgfg_acmmm2003.cpp(416) : error C2039: 'foreground_regions' : is not a member of 'CvFGDStatModel'
../../cvaux/include/cvaux.h(1240) : see declaration of 'CvFGDStatModel'
C:/Program Files/OpenCV/cvaux/src/cvbgfg_gaussmix.cpp(343) : error C2039: 'foreground_regions' : is not a member of 'CvGaussBGModel'
../../cvaux/include/cvaux.h(1300) : see declaration of 'CvGaussBGModel'


其所在行代码如下:
411: model->foreground_regions = first_seq;
416: model->foreground_regions = NULL;
1240:typedef struct CvFGDStatModel
{
CV_BG_STAT_MODEL_FIELDS();
CvBGPixelStat* pixel_stat;
IplImage* Ftd;
IplImage* Fbd;
IplImage* prev_frame;
CvFGDStatModelParams params;
}
CvFGDStatModel;
343: bg_model->foreground_regions = first_seq;
1300:typedef struct CvGaussBGModel
{
CV_BG_STAT_MODEL_FIELDS();
CvGaussBGStatModelParams params;
CvGaussBGPoint* g_point;
int countFrames;
}
CvGaussBGModel;

解决方法:
通过搜索关键字foreground_regions,发现在cvaux.h文件中,第1137行注释没有闭合,且有不明原因的

乱码,导致下一行定义的foreground_regions成为注释的一部分,源文件原始代码如下:
CvMemStorage* storage; /*storage for 揻oreground_regions?/ /
CvSeq* foreground_regions /*foreground object contours*/
改为如下形式:
CvMemStorage* storage; /*storage for foreground_regions?*/ /
CvSeq* foreground_regions /*foreground object contours*/
编译通过。在生成Release版的cvauxL.lib时0 error(s), 0 warning(s)
但在生成Debug版的cvauxDL.lib时0 error(s), 8670 warning(s)
; 道路提取程序 pro extract_road ; 1. 读取图像 image = READ_IMAGE('D:\第7次实验新\lab7.tif') ; 2. 转换为灰度图像 image_dims = SIZE(image, /DIMENSIONS) if (SIZE(image, /N_DIMENSIONS) eq 3) then begin r = REFORM(image[0,*,*]) g = REFORM(image[1,*,*]) b = REFORM(image[2,*,*]) gray = FIX(0.299*r + 0.587*g + 0.114*b) gray_dims = SIZE(gray, /DIMENSIONS) ; [高度, 宽度] endif else begin gray = image gray_dims = image_dims endelse ; 3. 自适应阈值二值化 binary = BYTARR(gray_dims[0], gray_dims[1]) win_size = 15 half_win = win_size/2 for i = half_win, gray_dims[0]-half_win-1 do begin row_start = MAX([i - half_win, 0]) row_end = MIN([i + half_win, gray_dims[0]-1]) for j = half_win, gray_dims[1]-half_win-1 do begin col_start = MAX([j - half_win, 0]) col_end = MIN([j + half_win, gray_dims[1]-1]) window = gray[row_start:row_end, col_start:col_end] local_thresh = MEAN(window) - 15 binary[i,j] = (gray[i,j] LT local_thresh) ? 1B : 0B endfor endfor ; 4. 形态学处理 struct_size = 7 struct_element = DIST(struct_size) LE (struct_size/2) struct_element = BYTE(struct_element) ; 闭运算填充孔洞 dilated = DILATE(binary, struct_element) closed = ERODE(dilated, struct_element) ; 5. 形态学重建 mask = closed seed = ERODE(closed, struct_element) reconstructed = seed for i = 1, 10 do begin dilated_seed = DILATE(reconstructed, struct_element) reconstructed = dilated_seed AND mask endfor ; 6. 面积过滤 - 兼容所有IDL版本的替代方法 final_roads = BYTARR(gray_dims[0], gray_dims[1]) ; 方法1: 使用HISTOGRAM计算前景像素比例 total_pixels = gray_dims[0] * gray_dims[1] foreground_pixels = WHERE(reconstructed EQ 1, count) ; 如果前景像素比例过小,直接使用二值图像 if (count gt 0 and count/total_pixels lt 0.05) then begin final_roads = binary endif else begin ; 方法2: 使用开运算去除小区域 large_struct = DIST(11) LE 5.5 ; 较大的结构元素 large_struct = BYTE(large_struct) ; 开运算去除小区域 eroded = ERODE(reconstructed, large_struct) opened = DILATE(eroded, large_struct) final_roads = opened endelse ; 7. 后处理 filled = DILATE(final_roads, struct_element) filled = ERODE(filled, struct_element) ; 8. 显示和保存结果 WINDOW, 0, TITLE='原始图像', XSIZE=gray_dims[1], YSIZE=gray_dims[0] TVSCL, gray WINDOW, 1, TITLE='二值化图像', XSIZE=gray_dims[1], YSIZE=gray_dims[0] TVscl, binary WINDOW, 2, TITLE='道路提取结果', XSIZE=gray_dims[1], YSIZE=gray_dims[0] TVscl, filled end 使其只提取道路
最新发布
06-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值