OpenCV clone()和copyTo()方法不能生成与原始相同类型的Mat?

时间:2015-07-02 15:48:33

标签: c++ opencv opencv-mat

我是OpenCV的新手并且跟随着一本书。我正在尝试使用以下内容提取指示组件区域的二进制图像:

function box_news_eight( $atts ) {
$code = '<div class="cf"></div>
<div class="box-home box-news-seven nb-eight">
    <div class="box-inner">
        <div  class="box-wrap">';
            $query = new WP_Query( array( 'posts_per_page' => 1, 'cat' => 4, 'ignore_sticky_posts' => 1, 'no_found_rows' => true, 'cache_results' => false ) );
            if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post();
                if ( $i_cont == 0 ) { $post_class = ' ws-post-first'; } else { $post_class = ' ws-post-sec'; }
                if ( has_post_thumbnail() ) { $has_class =  ''; } else { $has_class =  ' no-thumb'; }
               $code .= ' <div class="post'.$post_class.','. $has_class.'" role="article" itemscope="" itemtype="http://schema.org/Article">';              
                    $post_sidebars = '';
                    if ( $post_sidebars == 'sideNo' ) {
                        if ( function_exists("has_post_thumbnail") && has_post_thumbnail() ) : 
                            $code .= ' <div class="ws-thumbnail"><a href="'.get_the_permalink().'" rel="bookmark">
                                    .'get_the_post_thumbnail( 'bd-normal' ).'
                                </a></div>';
                            endif;
                        } else {
                                if ( function_exists("has_post_thumbnail") && has_post_thumbnail() ) :
                            $code .= '<div class="ws-thumbnail"><a href="'.get_the_permalink().'" rel="bookmark">';
                                        get_the_post_thumbnail( 'bd-large' );
                               $code .= '</a></div>';
                            endif; 
                        }
                    $code .= '<div class="ws-cap">
                        <div class="post-cats-bd">';
                            get_the_category( ' ' );
                        $code .= '</div>
                        <div class="ws-cap-inner">
                            <h3 itemprop="name" class="entry-title"><a itemprop="url" href="'.get_permalink( $post->ID ).'" rel="bookmark">'.get_the_title()'.</a></h3>
                            <div class="post-date-bd">'.
                                get_time().'
                            </div>
                        </div>
                    </div>
                </div>';
                 $i_cont++; endwhile; endif; wp_reset_postdata(); wp_reset_query();
            $query = new WP_Query( array( 'ignore_sticky_posts' => 1, 'offset'=>1, 'posts_per_page' => 4, 'cat' => 4, 'no_found_rows' => true, 'cache_results' => false ) );
            update_post_thumbnail_cache( $query );
            if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post();
                if ( $i_cont == 0 ) { $post_class = ' ws-post-first'; } else { $post_class = ' ws-post-sec'; }
                if ( has_post_thumbnail() ) { $has_class =  ''; } else { $has_class =  ' no-thumb'; }
                if( $count % 3 == 1 ) { echo '<div class="row">'; }
                    $code .= '<div class="post'.$post_class, $has_class.'" role="article" itemscope="" itemtype="http://schema.org/Article">
                        <div class="ws-meta">
                            <h3 itemprop="name" class="entry-title"><a itemprop="url" href="<'.get_permalink( $post->ID ).' rel="bookmark">'.the_title().'</a></h3>
                        </div>
                    </div>';
                      if( $count % 3 == 0 ) { echo "</div>\n"; }
                      $count++;

                      $i_cont++; endwhile; endif; wp_reset_postdata(); wp_reset_query();
                  if ( $count % 3 != 1 ) echo "</div>";
        $code .= '</div>
    </div>
</div>';
return $code;
}
add_shortcode( 'box_news_eight', 'box_news_eight' );

执行时,会产生以下错误:

cv::Mat result;
result = image.clone();
cv::watershed(image, result);

错误肯定是正确的,因为我在此SO帖子中使用segmentation.cpp:159: error: (-215) src.type() == CV_8UC3 && dst.type() == CV_32SC1 in function watershed 函数进行了验证:How to find out what type of a Mat object is with Mat::type() in OpenCV

我也尝试使用type2str而不是image.copyTo(result),但这会产生相同的错误消息。 我做错了什么,如何复制clone()以获得相同的类型?

我猜这个hacky解决方案是转换结果的颜色以匹配图像的颜色,就像这里所做的那样:OpenCV: How to convert CV_8UC1 mat to CV_8UC3但这似乎不对吗?

1 个答案:

答案 0 :(得分:3)

正如此处所述:Difference Clone CopyTo,在此上下文中clone()copyTo()之间没有区别。

事实上,clone()的源代码如下:

inline Mat Mat::clone() const
{
    Mat m;
    copyTo(m);
    return m;
}
然而,

copyTo可以与掩码结合使用,并且通常将数据复制到另一个矩阵,因此可以用于将子图像绘制到另一个图像中。

关于watershed的代码,文档说明了

  • 图像 - 输入8位3通道图像。
  • 标记 - 输入/输出标记的32位单通道图像(图)。它应该与图像大小相同。

所以image(您的image)和markers(您的result)不应该相同。

  

在将图像传递给函数之前,您必须粗略地勾画图像标记中具有正(> 0)索引的所需区域。因此,每个区域被表示为具有像素值1,2,3等的一个或多个连通分量。可以使用findContours()和drawContours()从二进制掩码中检索此类标记(请参阅watershed.cpp演示)。标记是未来图像区域的“种子”。标记中的所有其他像素(其与轮廓区域的关系未知且应由算法定义)应设置为0。在函数输出中,标记中的每个像素都设置为“种子”组件的值,或者设置为区域之间边界的-1。

     

该功能的可视化演示和使用示例可以在OpenCV示例目录中找到(参见watershed.cpp演示)。