我是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但这似乎不对吗?
答案 0 :(得分:3)
正如此处所述:Difference Clone CopyTo,在此上下文中clone()
和copyTo()
之间没有区别。
事实上,clone()
的源代码如下:
inline Mat Mat::clone() const
{
Mat m;
copyTo(m);
return m;
}
然而, copyTo
可以与掩码结合使用,并且通常将数据复制到另一个矩阵,因此可以用于将子图像绘制到另一个图像中。
关于watershed
的代码,文档说明了
所以image
(您的image
)和markers
(您的result
)不应该相同。
在将图像传递给函数之前,您必须粗略地勾画图像标记中具有正(> 0)索引的所需区域。因此,每个区域被表示为具有像素值1,2,3等的一个或多个连通分量。可以使用findContours()和drawContours()从二进制掩码中检索此类标记(请参阅watershed.cpp演示)。标记是未来图像区域的“种子”。标记中的所有其他像素(其与轮廓区域的关系未知且应由算法定义)应设置为0。在函数输出中,标记中的每个像素都设置为“种子”组件的值,或者设置为区域之间边界的-1。
该功能的可视化演示和使用示例可以在OpenCV示例目录中找到(参见watershed.cpp演示)。