- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试开发一种可以处理图像骨架的路径/曲线的代码。我想要一个来自两点之间骨架的点 vector 。
这段代码加了点就结束了,没找到解决办法。
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/imgproc/imgproc_c.h"
#include
#include
#include
#include
#include
using namespace cv;
sử dụng không gian tên std;
//this method to find the 8-neighbors of a point from image
vector search8Neighbor(cv::Mat mat,Point startPoint)
{
vector segment;
Point p;
//uchar p1 = mat.at(startPoint.x, startPoint.y);
uchar p2 = mat.at(startPoint.x-1, startPoint.y);
uchar p3 = mat.at(startPoint.x-1, startPoint.y+1);
uchar p4 = mat.at(startPoint.x, startPoint.y+1);
uchar p5 = mat.at(startPoint.x+1, startPoint.y+1);
uchar p6 = mat.at(startPoint.x+1, startPoint.y);
uchar p7 = mat.at(startPoint.x+1, startPoint.y-1);
uchar p8 = mat.at(startPoint.x, startPoint.y-1);
uchar p9 = mat.at(startPoint.x-1, startPoint.y-1);
//if(p1==255) segment.push_back(startPoint.x, startPoint.y);
if (p2 == 255) {
p.x=startPoint.x-1;
p.y=startPoint.y;
segment.push_back(p);
}
if(p3==255) {
p.x=startPoint.x-1;
p.y=startPoint.y+1;
segment.push_back(p);
}
if(p4==255) {
p.x=startPoint.x;
p.y=startPoint.y+1;
segment.push_back(p);
}
if(p5==255) {
p.x=startPoint.x+1;
p.y=startPoint.y+1;
segment.push_back(p);
}
if(p6==255) {
p.x=startPoint.x+1;
p.y=startPoint.y;
segment.push_back(p);
}
if(p7==255) {
p.x=startPoint.x+1;
p.y=startPoint.y-1;
segment.push_back(p);
}
if(p8==255){
p.x=startPoint.x;
p.y=startPoint.y-1;
segment.push_back(p);
}
if(p9==255) {
p.x=startPoint.x-1;
p.y=startPoint.y-1;
segment.push_back(p);
}
return segment ;
}
//this method return a vector of points from a skeleton that contains all the points
// between a start point "peak" and an end point
//this method use the idea of Breadth first search
vector traceLine(Mat img , Point peak)
{
vector vect1;
vector vect2;
img.at(peak.x,peak.y)=0;//
vect1.push_back(peak);//add peak to vect1
while(vect1.size() != 0)
{
Point p=vect1[0];
vect1.erase(vect1.begin());
vect2.push_back(p);
vector vectN;
vectN=search8Neighbor(img,p);
vector::iterator it;
it = vect1.begin();
//cout<<><>
for(int i=0;i<>
{
img.at(vectN[i].x,vectN[i].y)=0;
vect1.insert(it,vectN[i]);
}
}
return vect2;
}
int main( int argc, char** argv )
{
cv::Mat im = cv::imread("aa.jpg",0);
if (im.empty())
trả về -1;
cv::Mat img;
cv::threshold(im, img, 155, 255, CV_THRESH_BINARY);
vector vect1;
Point p;
p.x=20;
p.y=30;
if(mat.at(p.x-1, p.y)==255)
vect1=traceLine(img,p);
imshow("image",im);
cv::waitKey();
return 0 ;
}
câu trả lời hay nhất
Mat 以矩阵的正常行/列方式进行索引,因此您需要 mat.at
, 不是 mat.at
, 否则会造成混淆。
你在哪里:
vector::iterator it;
it = vect1.begin();
...
for(...)
vect1.insert(it,vectN[i]);
如果插入导致缓冲区被重新分配,这将中断,因为它随后指向一些已被释放的内存,或者可能重新分配给其他东西。而是使用
vect1.insert(vect1.begin(),vectN[i]);
(这将对您的程序似乎执行的操作给出略微不同的顺序)或使用 push_back()
真正获得广度优先行为。
最大的问题在于 search8Neighbor()。你在哪里uchar p2 = mat.at
如果 startPoint 指向图像边缘的像素会怎样?您将引用图像外部的像素,并且程序将徘徊,直到发生异常。在这里,您需要检查您在图像中的位置,并确保附近没有包含来自图像外部的像素。
biên tập我不相信如果像我说的那样改变代码就不会工作。我已经实现了修复并且它有效:
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/imgproc/imgproc_c.h"
#include
#include
#include
#include
#include
using namespace cv;
sử dụng không gian tên std;
// Find the 8-neighbors of a point from image.
vector search8Neighbor(cv::Mat mat,Point startPoint)
{
vector neighbors;
vector offsets;
offsets.push_back(Point(-1, 0)); // p2
offsets.push_back(Point(-1, 1)); // p3
offsets.push_back(Point( 0, 1)); // p4
offsets.push_back(Point( 1, 1)); // p5
offsets.push_back(Point( 1, 0)); // p6
offsets.push_back(Point( 1, -1)); // p7
offsets.push_back(Point( 0, -1)); // p8
offsets.push_back(Point(-1, -1)); // p9
vector::iterator it;
for(it = offsets.begin(); it < offsets.end(); ++it)
{
if(!((it->x < 0 && startPoint.x == 0)
|| (it->y < 0 && startPoint.y == 0)
|| (it->x > 0 && startPoint.x == mat.cols - 1)
|| (it->y > 0 && startPoint.y == mat.rows - 1)))
{
Point p(startPoint + *it);
if(mat.at(p) == 255)
neighbors.push_back(p);
}
}
return neighbors;
}
//this method return a vector of points from a skeleton that contains all the points
// between a start point "peak" and an end point
//this method use the idea of Breadth first search
vector traceLine(Mat img , Point peak)
{
vector vect1;
vector vect2;
img.at(peak.y, peak.x)=0;//
vect1.push_back(peak);//add peak to vect1
while(vect1.size() != 0)
{
Point p=vect1[0];
vect1.erase(vect1.begin());
vect2.push_back(p);
vector vectN;
vectN = search8Neighbor(img, p);
//cout<< " vectN.size()=" << vectN.size()<<>
for(int i = 0; i < int(vectN.size()); ++i)
{
img.at(vectN[i].y, vectN[i].x)=0;
vect1.push_back(vectN[i]);
}
}
return vect2;
}
int main( int argc, char** argv )
{
cv::Mat im = cv::imread("aa.jpg",0);
if (im.empty())
trả về -1;
cv::Mat img;
cv::threshold(im, img, 155, 255, CV_THRESH_BINARY);
imshow("thresholded image",im);
vector vect1;
Point p(3, 32);
uchar u = img.at(p.x, p.y);
if(img.at(p) == 255)
vect1 = traceLine(img, p);
Mat output(im.rows, im.cols, CV_8UC3, Scalar(0, 0, 0));
vector::iterator it;
for(it = vect1.begin(); it < vect1.end(); ++it)
{
Vec3b green(0, 255, 0);
output.at(*it) = green;
}
imshow("output", output);
cv::waitKey();
return 0 ;
}
关于c++ - 曲线/路径骨架二值图像处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16622855/
我被要求从存在的主干模型(可选)中删除几个属性。我的第一个意图是在模型上放置类似before_save回调的内容。但是我没有发现任何信息。 有可能在 Backbone 这样做吗? 最佳答案 只需覆盖默
我对使用 Backbone .js模型获取方法感到非常困惑。请参阅以下示例 Backbone 路由器: profile: function(id) { var model = new Accoun
我想根据现有的分段创建骨架,类似于此处所做的(来自 sk-image): 但是我想对 3D 数据执行此操作。那里有代码吗?最好使用 Python,但任何语言都有帮助。 我知道 this很棒的网站,但我
通常,我为与之合作的后端开发人员创建静态html prototype/skeleton。这有助于在实施网站之前发现UI / IA中的错误并进行昂贵的重写。 我想更进一步,并创建这些prototypes
我最近发现了 skeleton.css,它正是我要找的。我不太了解列,但是按钮的示例完全符合我的要求,因为在屏幕变窄时堆叠元素。我所拥有的效果很好,但我还不够精通 css,无法将按钮制作成列。我已将
我正在使用 Skeleton.css 在 wordpress 中创建一个网格系统 教程显示了标题的以下标记,在这里您可以看到 Logo 有 3 个类,- 五列和 clearfix
我正在使用“Microsoft Kinect SDK 1.8”。对于骨架跟踪,我计算了 FPS,大约是 10-15。 “Microsoft”是否提供任何规范?我想提高骨架帧数据的 FPS,可以吗? 最
我正在尝试将两个图像放在一个表单旁边,并使用骨架 css 使其响应: U
有谁知道我在哪里可以找到一个像样的框架页面或用于创建全 FBML Facebook 应用程序的示例?我查遍了官方维基并做了很多搜索,但我找不到任何可靠的东西。 wiki 中的大多数示例要么过时、损坏,
我想制作一个骨架 css 直到页面完全加载。我想到了这个解决方案。因此,如果 javascript 被禁用,我不会有任何问题。那是对的吗?也许你有更好的解决方案?谢谢! .slider {
我有一个使用骨架 css 实现的表单。我使用的是三列(即三分之一列)布局,但由于列内容的各自长度,这导致了大量空白。我更喜欢类似于以下的水平布局: 文本框 1 文本框 2 文本框 3 文本框4 文本框
假设我有一个名为 dict1 的字典,它具有我想要的新字典的骨架(顺序和嵌套深度)。例如: dict1 = { "Personnel": { "Performance": ""
Như hiện tại, câu hỏi này không phù hợp với định dạng Hỏi & Đáp của chúng tôi. Chúng tôi hy vọng câu trả lời sẽ được hỗ trợ bởi các sự kiện, trích dẫn hoặc chuyên môn, nhưng câu hỏi có thể gây ra tranh luận, tranh luận, bỏ phiếu hoặc thảo luận mở rộng. Nếu bạn cảm thấy vấn đề này có thể được cải thiện và có thể mở lại, hãy truy cập
因此,我了解我们可以执行以下操作: Collection.fetch({success:function(){bla ..}}) 但是说我想要这样的事情: Collection.fetch({成功:功
我想开发一个 swift cocoa pod,但是我不知道如何开始。 Cocoapods 预发布版现在支持 swift但是他们目前没有说明如何创建新的 swift 项目 pod 的说明。 当前关于创建
我目前正在使用提供深度图的 Processing Kinect 库。如果可能的话,我想知道如何使用它并使用它来创建 2D 骨架。不在这里寻找任何代码,只是我可以用来实现这些结果的一般过程。 此外,鉴于
我创建了一个使用多个“ View ”运行的 Vaadin Web 应用程序。 我想做的是应用 MVC/MVP 设计模式,它将无缝集成各种 View 中显示的信息。 到目前为止,我有一个带有登录、注册和
如何实现下面提到的view the URL 一种加载 View ,类似于许多使用它的应用程序,如 TvShowTime 最佳答案 这称为微光效果。 Facebook 已经开源了一个库,提供类似 fac
据我所知,JAX-WS(JAX-RPC)的前身使用的是 客户端 stub (代理)服务器骨架(也称为服务器端 stub ,或 Tie)系统,用于客户端和服务之间的通信。 但是,如果我正在阅读 JAX-
我已经编写了一个 WSDL 来生成 stub 和骨架,但我的骨架没有在 eclipse 中生成。我正在使用 Eclipse 的 Helios 版本。 谁能说出 WSDL 的问题是什么? 我想使用 Ax
Tôi là một lập trình viên xuất sắc, rất giỏi!