StupidBeauty
Read times:1617Posted at:Sun Dec 15 21:26:10 2013
- no title specified

OpenCV2.4.7.0文档翻译:多方面的图片变换,Miscellaneous Image Transformations

adaptiveThreshold

对一个数组进行自适应的阈值化处理。

C++: void adaptiveThreshold (InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C )

Python: cv2.adaptiveThreshold (src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) → dst

C: void cvAdaptiveThreshold (const CvArr* src, CvArr* dst, double max_value, int adaptive_method=CV_ADAPTIVE_THRESH_MEAN_C, int threshold_type=CV_THRESH_BINARY, int block_size=3, double param1=5 )

Python: cv.AdaptiveThreshold (src, dst, maxValue, adaptive_method=CV_ADAPTIVE_THRESH_MEAN_C, thresholdType=CV_THRESH_BINARY, blockSize=3, param1=5) → None

参数:

  • •. src8位单通道的源图片。

  • •. dst – 目标图片,尺寸及类型与src 一致。

  • •. maxValue – 当条件满足时,将被赋值给对应像素点的非0值。参考下面的详细说明。

  • •. adaptiveMethod – 要使用的自适应阈值算法,ADAPTIVE_THRESH_MEAN_CADAPTIVE_THRESH_GAUSSIAN_C。参考下面的详细说明。

  • •. thresholdType – 阈值化类型,必须是THRESH_BINARY THRESH_BINARY_INV

  • •. blockSize – 被用于计算当前像素点的阈值的相邻像素点区域的尺寸:3、5、7等等( ☯:只能用奇数 )。

  • •. C – 从平均值或加权平均值(参考下面的详细说明)中减去的常数值。一般情况下是正数,但是也可以设置为0或负数。

这个函数会根据以下公式来将一张灰度图转换成单色图:

  • •. THRESH_BINARY

  • •. THRESH_BINARY_INV

其中T(x,y)是针对每个像素点单独计算的阈值。

这个函数可对图片进行原地处理。

参考

threshold() blur() GaussianBlur()

cvtColor

将一张图片从一个颜色空间转换到另一个颜色空间。

C++: void cvtColor (InputArray src, OutputArray dst, int code, int dstCn=0 )

Python: cv2.cvtColor (src, code[, dst[, dstCn]]) → dst

C: void cvCvtColor (const CvArr* src, CvArr* dst, int code )

Python: cv.CvtColor (src, dst, code) → None

参数

  • •. src – 输入图片8位无符号16位无符号( CV_16UC... )或单精度浮点数类型。

  • •. dst – 输出图片,与 src 拥有相同的尺寸及色深。

  • •. code – 颜色空间转换代码(参考下面的详细说明)。

  • •. dstCn – 目标图片中的通道数;如果参数值为0,则通道数会自动从 src code 中继承。

这个函数将一张输入图片从一个颜色空间转换到另一个颜色空间。当妳的转换中牵涉到RGB 颜色空间时,应该显式地指定各个通道的顺序(RGB还是BGR)。注意,人们通知认为OpenCV 中的默认颜色格式是RGB,而事实上却是BGR(字节顺序是相反的)。所以,在一张标准的(24位)彩色图片中,第一个字节是一个8位的蓝色分量,第二个字节是绿色分量,第三个字节是红色分量。第四、五、六个字节就对应着第二个像素(蓝、绿、红),如此下去。

R、G、B三个通道的习惯取值范围是

  • •.对于CV_8U格式的图片0到255

  • •.对于CV_16U 格式的图片0到65535

  • •.对于CV_32F格式的图片0到1

对于线性变换来说,取值范围是无需担心的。但是,对于非线性变换,如果输入的图片是RGB 格式的,那么,应当先将它一般化(normalized)到适当的取值范围,这样才能得到正确的结果,例如,对于RGB L*u*v*的变换就需要这样。例如,如果妳在不调整取值范围的情况下,将一个8位的图片转换到一个32位的浮点数图片,则,这个函数会假设它的取值范围是0..255,而不是0..1。所以,在调用 cvtColor 之前,妳需要先将图片中的值缩小:

img *= 1./255;

cvtColor(img, img, CV_BGR2Luv);

如果妳对8位的图片使用 cvtColor ,则,在转换过程中会丢失一些信息。对于狠多程序来说,这种丢 失情况是察觉不到的,但是,对于那些需要保留完整颜色范围或者只是变换了图片做了处理之后又变换回来的程序来说,建议使用32位的图片格式。

这个函数可做以下转换:

  • •.RGB GRAY ( CV_BGR2GRAY CV_RGB2GRAY CV_GRAY2BGR CV_GRAY2RGB ) 在RGB颜色空间中做变换,例如添加/删除透明度通道,反转通道顺序,在当前颜色格式与16位RGB 颜色格式(R5:G6:B5或R5:G5:B5)之间转换,以及在当前颜色格式与灰度颜色格式之间转换:

    使用以下代码可将一张RGB 图片转换成灰度格式

    cvtColor(src, bwsrc, CV_RGB2GRAY);

    可使用 mixChannels() 来进行更高端的通道顺序调整操作。

  • •.RGB CIE XYZ。使用D65 作为白点的Rec 709( CV_BGR2XYZ、CV_RGB2XYZ、CV_XYZ2BGR、CV_XYZ2RGB ):

    X、Y和Z覆盖了整个取值范围(对于浮点数格式的图片,Z可能会超过1)。

  • •.RGB YCrCb JPEG (或YCC) ( CV_BGR2YCrCb CV_RGB2YCrCb CV_YCrCb2BGR CV_YCrCb2RGB )

    其中

    YCr和Cb覆盖整个取值范围

  • •.RGB HSV ( CV_BGR2HSV CV_RGB2HSV CV_HSV2BGR CV_HSV2RGB )

    对于8位和16位图片,RG和B都被转换为浮点数格式,并且缩放至0到1的范围内。

    如果H<0,则H H+360。输出结果中0 V 1,0 S 1 0 H 360

    接下来,这些值会转换成目标数据类型:

    • •.8位图片

    • •.16位图片(目前不支持)

    • •.32位图片

      HS和V的值保留原样

  • •.RGB HLS ( CV_BGR2HLS CV_RGB2HLS CV_HLS2BGR CV_HLS2RGB )

    对于8位和16位图片,RG和B都被转换为浮点数格式,并且缩放至0到1的范围内。

    如果H<0,则H H+360。输出结果中0 ≤L≤ 1,0 S 1 0 H 360

    接下来,这些值会转换成目标数据类型:

    • •.8位图片

      L 255∙L,S 255∙S,H H/2 (以适应0到255的范围) ☯:原文是“V 255∙ V ,S 255∙S,H H/2 to fit to 0 to 255)

    • •.16位图片(目前不支持)

      L←65535 L,S←65535∙S,H←H ☯:原文是“V ←65535 V ,S←65535∙S,H←H

    • •.32位图片

      HS、L的值保留原样( ☯:原文是“H,S,V are left as is”

  • •.RGB CIE L*a*b* ( CV_BGR2Lab CV_RGB2Lab CV_Lab2BGR CV_Lab2RGB )

    对于8位和16位图片,RG和B都被转换为浮点数格式,并且缩放至0到1的范围内。

    其中

    输出结果中0 L 100,-127 a 127,-127 b 127。接下来,这些值会转换成目标数据类型:

    • •.8位图片

    • •.16位图片

      (目前不支持)

    • •.32位图片

      La和b的值保留原样

  • •.RGB CIE L*u*v* ( CV_BGR2Luv CV_RGB2Luv CV_Luv2BGR CV_Luv2RGB )

    对于8位和16位图片,RG和B都被转换为浮点数格式,并且缩放至0到1的范围内。

    输出结果中0 L 100,-134 u 220,-140 v 122。

    接下来,这些值会转换成目标数据类型:

    • •.8位图片

    • •.16位图片

      (目前不支持)

    • •.32位图片

      Lu和v的值原样保留

    以上这些在RGB 颜色空间和其它颜色空间之间转换的公式是从网上找到的,主要是Charles Poynton这个网站 http://www.poynton.com/ColorFAQ.html

  • •.Bayer RGB ( CV_BayerBG2BGR CV_BayerGB2BGR CV_BayerRG2BGR CV_BayerGR2BGR CV_BayerBG2RGB CV_BayerGB2RGB CV_BayerRG2RGB CV_BayerGR2RGB )Bayer模式在CCD和CMOS摄像头中被广泛使用。它允许妳从单个颜色平面中获取到彩色图片,在这个平面中RG和B像素(特定颜色分量的传感器)是交错排列在一起的

    对于单个像素,输出的RGB 分量是按照周围具有相同颜色的1、2或4个相邻像素的值来插值计算出来的。对于以上模式,还有多种变种,其实现手段就是将整个模式向左和/或向上移动一个像素。在转换类型常量 CV_BayerC 1 C 2 2BGR CV_BayerC 1 C 2 2RGB 中的那两个字母C 1 和C 2 ,就是表示这种特殊模式的。它们对应于第二行中第二、三列的两个分量。例如,上图中的模式就对应于非常流行的“BG”类型。

distanceTransform

计算源图片中每个像素点到最近的0像素点之间的距离。

C++: void distanceTransform (InputArray src, OutputArray dst, int distanceType, int maskSize )

C++: void distanceTransform (InputArray src, OutputArray dst, OutputArray labels, int distanceType, int maskSize, int labelType=DIST_LABEL_CCOMP )

Python: cv2.distanceTransform (src, distanceType, maskSize[, dst]) → dst

C: void cvDistTransform (const CvArr* src, CvArr* dst, int distance_type=CV_DIST_L2, int mask_size=3, const float* mask=NULL, CvArr* labels=NULL, int labelType=CV_DIST_LABEL_CCOMP )

Python: cv.DistTransform (src, dst, distance_type=CV_DIST_L2, mask_size=3, mask=None, labels=None) → None

参数

  • •. src – 8位,单通道(单色)源图片

  • •. dst – 输出图片,其中储存的是计算出来的距离。它是一张32位浮点数单通道图片,与 src 尺寸相同。

  • •. distanceType – 距离类型。可以是CV_DIST_L1 CV_DIST_L2CV_DIST_C

  • •. maskSize – 距离变换掩膜的尺寸。它可以是35或CV_DIST_MASK_PRECISE (最后这个选项只对第一个函数有效)。对于 CV_DIST_L1 CV_DIST_C 两种距离类型,这个参数会被强制设置为3,因为一个3x3的掩膜所得到的结果与5x5或更大尺寸的掩膜得到的结果完全一样。

  • •. labels – 可选的标签二维输出数组(离散Voronoi 图)。它的类型为 CV_32SC1 ,并且与 src 的尺寸相同。参考下面的详细说明。

  • •. labelType – 要构建的标签数组的类型。如果labelType==DIST_LABEL_CCOMP ,则, src 中每个由连通的0像素组成的区域(以及那些与该连通区域最近的那些非0像素)会被标记为同样的标签。如果 labelType==DIST_LABEL_PIXEL ,则,每个0像素(以及那些与该像素最近的非0像素)都会被标记为单独的标签。

distanceTransform函数计算每个单色像素到最近的0像素之间的大致或精确距离。对于0像素,其距离显然是0.

如果maskSize == CV_DIST_MASK_PRECISE并且distanceType == CV_DIST_L2 ,则,这个函数会使用 [Felzenszwalb04] 中说明的算法。这个算法会利用TBB 库来进行并行计算。

其它情况下,会使用 [Borgefors86] 这个算法。就是说,对于每个像素,这个函数会找到由以下基本位移组成的指向最近0像素的最短路径:水平、竖直、对角线或象棋中的马步(最后一种对于5x5的掩膜有效)。整个距离是按照这些基本位移的和来计算的。由于距离函数应当是对称的,所以,所有的水平和竖直位移都必须具有相同的开销(标记为 a ),所有的对角线位移必须具有相同的开销(标记为 b ),所有的马步位移必须具有相同的开销(标记为 c )。对于 CV_DIST_C CV_DIST_L1 类型,计算出的距离是精确的,而对于 CV_DIST_L2类型(欧几里德距离),所计算出来的距离会有相对的偏差(5x5的掩膜会给出更精确的结果)。对于 a ``b``和c OpenCV使用的是原论文中建议的值

CV_DIST_C

(3x3)

a = 1, b = 1

CV_DIST_L1

(3x3)

a = 1, b = 2

CV_DIST_L2

(3x3)

a=0.955, b=1.3693

CV_DIST_L2

(5x5)

a=1, b=1.4, c=2.1969

一般情况下,要快速地计算出大致的 CV_DIST_L2 距离,会使用一个3x3掩膜。要想计算出一个更精确的 CV_DIST_L2 距离,会使用一个5x5掩膜或精确算法。注意,精确算法和近似算法的复杂度都是与像素点相关的线性复杂度。

此函数的第二个变种,不仅仅计算每个像素(x,y)的最小距离,还会标识出由0像素组成的最近的连通区域( labelType==DIST_LABEL_CCOMP )或最近的0像素( labelType==DIST_LABEL_PIXEL )。对应连通区域/像素的索引存储在labels(x,y)。当 labelType==DIST_LABEL_CCOMP时,这个函数自动地寻找输入图片中由0像素组成的连通区域,并且使用唯一的标签来标记它们。当 labelType==DIST_LABEL_CCOMP 时,这个函数扫描整张输入图片,并且将所有的0像素都标记为唯一的标签。

在这种模式下,复杂度仍然是线性的。也就是说,这个函数会以一种非常快的方法来计算一张单色图片的Voronoi 图。目前,第二个变种只能使用近似距离变换算法,也就是说,目前不支持maskSize=CV_DIST_MASK_PRECISE

注意

  • •.在此处可找到一个使用距离变换的示例 opencv_source_code/samples/cpp/distrans.cpp

floodFill

使用指定颜色来填充一个连通区域。

C++: int floodFill (InputOutputArray image, Point seedPoint, Scalar newVal, Rect* rect=0, Scalar loDiff=Scalar(), Scalar upDiff=Scalar(), int flags=4 )

C++: int floodFill (InputOutputArray image, InputOutputArray mask, Point seedPoint, Scalar newVal, Rect* rect=0, Scalar loDiff=Scalar(), Scalar upDiff=Scalar(), int flags=4 )

Python: cv2.floodFill (image, mask, seedPoint, newVal[, loDiff[, upDiff[, flags]]]) → retval, rect

C: void cvFloodFill (CvArr* image, CvPoint seed_point, CvScalar new_val, CvScalar lo_diff=cvScalarAll(0), CvScalar up_diff=cvScalarAll(0), CvConnectedComp* comp=NULL, int flags=4, CvArr* mask=NULL )

Python: cv.FloodFill (image, seed_point, new_val, lo_diff=(0, 0, 0, 0), up_diff=(0, 0, 0, 0), flags=4, mask=None) → comp

参数:

  • •. image – 输入/输出、 1通道或3通道、8位或浮点数格式图片。此图片将会被这个函数修改,除非在此函数的第二个变种中设置了FLOODFILL_MASK_ONLY标志位。参考下面的详细说明。

  • •. mask

    (只对第二个函数有效) 一个操作掩膜,应当是单通道、8位的图片,比源图片宽2个像素,高2个像素。这个函数会使用并且更新掩膜,所以,妳要负责将掩膜( mask )内容初始化。水漫填充无法处理掩膜中的非0像素。例如,可使用一个边缘检测的输出结果来作为掩膜,以避免填充到边缘上。可以在多次调用这个函数时使用同一个掩膜,以确保填充区域不重叠。

    注意

    由于掩膜比被填充图片要大,所以,image 中的像素点(x,y)对应于 mask 中的像素点(x+1,y+1)。

  • •. seedPoint – 填充的起点。

  • •. newVal – 被填充的那些像素点的新颜色值。

  • •. loDiff – 被保留的像素与它周围属于连通区域的像素点或种子像素点之间较低亮度/颜色差的最大值。

  • •. upDiff – 被保留的像素与它周围属于连通区域的像素点或种子像素点之间较高亮度/颜色差的最大值。

  • •. rect – 可选的输出参数,由此函数设置为被填充的区域的最小包围矩形。

  • •. flags

    可选的标志位。较低的那些位中包含着一个连通性值,4(默认值)或8,这个值会在函数中使用到。连通性决定了某个像素的哪些相邻像素会被考虑在内。较高的那些位可以是0,或者是以下标志位的组合:

    • •. FLOODFILL_FIXED_RANGE 如果设置了这个标志位,则,会采用当前像素与种子像素之间的差来进行计算。否则,会使用当前像素与相邻像素之间的差来进行计算(那样的话,范围就会漂移出去)。

    • •. FLOODFILL_MASK_ONLY 如果设置了这个标志位,则,这个函数不会修改图片本身(newVal会被忽略),只会填充掩膜。这个标志位只可对第二个变种函数使用。

floodFill使用指定的颜色对从种子像素点开始的连通区域进行填充。连通性是使用相邻像素之间的颜色/亮度差来确定的。如果满足以下条件,则认为( x,y )处的像素属于连通区域:

  • •.

    对于灰色图及漂移范围

  • •.

    对于灰色图及固定范围

  • •.

    对于彩色图片及漂移范围

并且

  • •.

    对于彩色图片及固定范围

并且

其中,src(x',y')指的是当前像素的相邻像素中某个已知属于该连通区域的像素的值。也就是说,要想被加入到该连通区域中的话,当前像素的颜色/亮度应当足够接近:

  • •.对于漂移范围的情况,它的相邻像素中某个已知属于该连通区域的像素的颜色/亮度。

  • •.对于固定范围的情况,种子像素点的颜色/亮度。

使用这些函数可以做到:就地使用指定颜色将连通区域标记出来;或者,构建出一个掩膜,再提取出轮廓;或者,将该区域复制到另一张图片中;等等。

参考

findContours()

注意

  • •.可在此处找到一个使用FloodFill技术的示例 opencv_source_code/samples/cpp/ffilldemo.cpp

integral

计算一张图片的积分。

C++: void integral (InputArray src, OutputArray sum, int sdepth=-1 )

C++: void integral (InputArray src, OutputArray sum, OutputArray sqsum, int sdepth=-1 )

C++: void integral (InputArray src, OutputArray sum, OutputArray sqsum, OutputArray tilted, int sdepth=-1 )

Python: cv2.integral (src[, sum[, sdepth]]) → sum

Python: cv2.integral2 (src[, sum[, sqsum[, sdepth]]]) → sum, sqsum

Python: cv2.integral3 (src[, sum[, sqsum[, tilted[, sdepth]]]]) → sum, sqsum, tilted

C: void cvIntegral (const CvArr* image, CvArr* sum, CvArr* sqsum=NULL, CvArr* tilted_sum=NULL )

Python: cv.Integral (image, sum, sqsum=None, tiltedSum=None) → None

参数:

  • •. imageWxH的输入图片,8位或浮点数(32f或64f)类型。

  • •. sum(W+1)x(H+1)的积分图片,32位整数或浮点数类型(32f或64f)。

  • •. sqsum – 将像素点的值做平方计算之后得到的积分图片;尺寸是(W+1)x(H+1),双精度浮点数类型(64f)的数组。

  • •. tilted – 将图片旋转45度之后得到的积分图片;尺寸是(W+1)x(H+1),数据类型与 sum 一致。

  • •. sdepth – 预期的积分及倾斜积分图片的位深 CV_32S CV_32F或CV_64F

这个函数,按照以下公式来计算源图片的一张或多张积分图片:

使用这些积分图片,妳就可以在常数时间内计算当前图片中一个特定的右上矩形(up-right)或旋转后矩形区域的和、平均值及标准差,例如:

举个例子,这使得妳可以快速地以可变窗口大小做模糊操作,或者做块相关性(block correlation)计算。对于多通道的图片,每个通道的和都是单独累积的。

举个实际的例子,以下图片展示的是,计算一个正方向(straight)的矩形 Rect(3,3,3,2) 和一个倾斜的矩形 Rect(5,1,2,3) 的积分的情况。原始图片 image 中选中的像素被显示出来了,积分图片 sum tilted 中相关的像素也被显示出来了。

threshold

对每个数组元素应用一个固定级别的阈值化操作。

C++: double threshold (InputArray src, OutputArray dst, double thresh, double maxval, int type )

Python: cv2.threshold (src, thresh, maxval, type[, dst]) → retval, dst

C: double cvThreshold (const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type )

Python: cv.Threshold (src, dst, threshold, maxValue, thresholdType) → None

参数

  • •. src – 输入数组(单通道,8位或32位浮点数格式)。

  • •. dst – 输出数组,尺寸及类型与 src 一致。

  • •. thresh – 阈值。

  • •. maxval – 用于THRESH_BINARY THRESH_BINARY_INV 阈值处理类型的最大值。

  • •. type – 阈值处理类型(参考下面的详细说明)。

这个函数对一个单通道的数组应用一个固定级别的阈值化操作。这个函数一般用于从一张灰度图片中转换出一张单色图片 compare() 也可用于这个目的),或者用于去除噪声,也就是说,过滤掉那些值太小或太大的像素。这个函数支持多种阈值化操作。它们由 type 参数来决定:

  • •. THRESH_BINARY

  • •. THRESH_BINARY_INV

  • •. THRESH_TRUNC

  • •. THRESH_TOZERO

  • •. THRESH_TOZERO_INV

另外,有个特殊值 THRESH_OTSU ,可与以上任一个值组合使用。在这种情况下,这个函数会使用 Otsu’s 的算法来确定一个最佳的阈值,而不是使用调用代码中指定的 thresh 。这个函数会返回计算出来的阈值。目前,Otsu的方法只对8位图片有效。

参考

adaptiveThreshold() findContours() compare() min() max()

watershed

使用分水岭算法来进行一次基于标记的图片分段计算。

C++: void watershed (InputArray image, InputOutputArray markers )

C: void cvWatershed (const CvArr* image, CvArr* markers )

Python: cv2.watershed (image, markers) → None

参数:

  • •. image – 输入图片,8位3通道。

  • •. markers – 输入/输出图片(地图),32位单通道,里面记录的是标记信息。它应当与image 具有相同的尺寸。

这个函数实现了分水岭算法中的一个变种,不带参数的基于标记的分段算法,详细说明见[Meyer92]

在将图片传递给这个函数做处理之前,妳需要在图片markers 中使用正数(>0)的索引值来大概地圈出目标区域。可以,每个区域都使用一个或多个连通区域来表示,它们的像素值分别为1、2、3等等。这些标记可使用 findContours() drawContours() 从单色掩膜中提取出来(参考 watershed.cpp 示例)。这些标记是未来计算出的图片区域的“种子”。 markers 中的所有其它的像素,它们与大致圈出的区域的关系是未知的,并且将会由这个算法来计算,所以,它们的值应当设置为0.在这个函数的输出图片中,每个像素的值,或者是设置为某个“种子”区域的值,或者是设置为-1,表示它处于两个区域之间的边界上。

可在OpenCV 示例目录中找到一个对此函数的可视化演示示例(参考watershed.cpp示例)。

注意

两个相邻的连通区域不一定会被一个分水岭边界(-1的像素点)分割开;比如说,它们可能在一开始传递给函数的标记图片中就已经是相连接的了。

参考

findContours()

注意

  • •.可在此处找到分水岭算法的使用示例 opencv_source_code/samples/cpp/watershed.cpp

grabCut

运行GrabCut 算法。

C++: void grabCut (InputArray img, InputOutputArray mask, Rect rect, InputOutputArray bgdModel, InputOutputArray fgdModel, int iterCount, int mode=GC_EVAL )

Python: cv2.grabCut (img, mask, rect, bgdModel, fgdModel, iterCount[, mode]) → None

参数:

  • •. img – 输入图片,8位3通道。

  • •. mask

    输入/输出的掩膜,8位单通道。当mode 被设置为 GC_INIT_WITH_RECT 时,这个掩膜由函数来自行初始化。它的各个元素可取以下值:

    • •. GC_BGD 定义一个明显的背景像素。

    • •. GC_FGD 定义一个明显的前景(对象)像素。

    • •. GC_PR_BGD 定义一个可能的背景像素。

    • •. GC_PR_FGD 定义一个可能的前景像素。

  • •. rect – 包含一个分段对象的感兴趣区域。感兴趣区域之外的那些像素会被标记为“明显的背景”。当 mode==GC_INIT_WITH_RECT 时,这个参数才会生效。

  • •. bgdModel – 背景模型的临时数组。当妳正在处理同一张图片时,不要修改它。

  • •. fgdModel – 前景模型的临时数组。当妳正在处理同一张图片时,不要修改它。

  • •. iterCount – 在返回结果之前,这个算法应当进行的迭代次数。注意,可在mode==GC_INIT_WITH_MASK mode==GC_EVAL 模式下,通过再次调用这个函数来对结果进行改善。

  • •. mode

    操作模式,可取以下各个模式中的一个:

    • •. GC_INIT_WITH_RECT 函数会使用所提供的矩形来初始化状态及掩膜。然后,它会将算法迭代运行iterCount 次。

    • •. GC_INIT_WITH_MASK 函数会使用所提供的掩膜来初始化状态。注意,GC_INIT_WITH_RECTGC_INIT_WITH_MASK可以同时使用。然后,位于感兴趣区域之外的所有像素都被自动标记为GC_BGD

    • •. GC_EVAL 这个值的意思是,应当直接继续运行这个算法。

这个函数实现了GrabCut图片分段算法。参考grabcut.cpp 示例,以学会如何使用它。

注意

  • •.在此处可找到一个使用GrabCut算法的示例 opencv_source_code/samples/cpp/grabcut.cpp

英拉

Your opinions
Your name:Email:Website url:Opinion content: