- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试编写一个程序,可以围绕某个对象创建一个多边形(任意数量的边)并找到多边形的质心。为此,我选择使用 convexhull 和 findContours 函数。在下面的程序中,您将获得两个窗口。一个窗口包含用于更改过滤器的 HSV 和形态值的轨迹栏,另一个窗口包含过滤后的图像。过滤图像并获得二值图像后,您必须单击“c”找到轮廓,然后单击“h”找到凸包。过滤图像和执行形态学操作不是问题。主要问题是寻找轮廓。
#include<iostream>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2\core\core.hpp>
#include<opencv2\video\background_segm.hpp>
#include<Windows.h>
using namespace cv;
using namespace std;
//functions prototypes
void on_trackbar(int, void*);
void createTrackbars();
void showimgcontours(Mat &threshedimg, Mat &original);
void toggle(int key);
void morphit(Mat &img);
void blurthresh(Mat &img);
//function prototypes ends here
//boolean toggles
bool domorph = false;
bool doblurthresh = false;
bool showchangedframe = false;
bool showcontours = false;
bool showhull = false;
//boolean toggles end
int H_MIN = 0;
int H_MAX = 255;
int S_MIN = 0;
int S_MAX = 255;
int V_MIN = 0;
int V_MAX = 255;
int kerode = 1;
int kdilate = 1;
int kblur = 1;
int threshval = 0;
int main(void)
{
createTrackbars();
on_trackbar(0, 0);
Mat frame, hsvframe, rangeframe;
int key;
VideoCapture cap(0);
while ((key = waitKey(30)) != 27)
{
toggle(key);
cap >> frame;
flip(frame, frame, 180);
cvtColor(frame, hsvframe, COLOR_BGR2HSV);
inRange(hsvframe, Scalar(H_MIN, S_MIN, V_MIN), Scalar(H_MAX, S_MAX, V_MAX), rangeframe);
if (domorph)
morphit(rangeframe);
if (doblurthresh)
blurthresh(rangeframe);
if (showcontours)
showimgcontours(rangeframe, frame);
if (showchangedframe)
imshow("Camera", frame);
else
imshow("Camera", rangeframe);
}
}
void on_trackbar(int, void*)
{//This function gets called whenever a
// trackbar position is changed
if (kerode == 0)
kerode = 1;
if (kdilate == 0)
kdilate = 1;
if (kblur == 0)
kblur = 1;
}
void createTrackbars()
{
String trackbarWindowName = "TrackBars";
namedWindow(trackbarWindowName, WINDOW_NORMAL);
createTrackbar("H_MIN", trackbarWindowName, &H_MIN, H_MAX, on_trackbar);
createTrackbar("H_MAX", trackbarWindowName, &H_MAX, H_MAX, on_trackbar);
createTrackbar("S_MIN", trackbarWindowName, &S_MIN, S_MAX, on_trackbar);
createTrackbar("S_MAX", trackbarWindowName, &S_MAX, S_MAX, on_trackbar);
createTrackbar("V_MIN", trackbarWindowName, &V_MIN, V_MAX, on_trackbar);
createTrackbar("V_MAX", trackbarWindowName, &V_MAX, V_MAX, on_trackbar);
createTrackbar("Erode", trackbarWindowName, &kerode, 31, on_trackbar);
createTrackbar("Dilate", trackbarWindowName, &kdilate, 31, on_trackbar);
createTrackbar("Blur", trackbarWindowName, &kblur, 255, on_trackbar);
createTrackbar("Thresh", trackbarWindowName, &threshval, 255, on_trackbar);
}
void morphit(Mat &img)
{
erode(img, img, getStructuringElement(MORPH_RECT, Size(kerode, kerode)));
dilate(img, img, getStructuringElement(MORPH_RECT, Size(kdilate, kdilate)));
}
void blurthresh(Mat &img)
{
//medianBlur(img,img,kblur%2+3+kblur);
blur(img, img, Size(kblur, kblur), Point(-1, -1), BORDER_DEFAULT);
threshold(img, img, threshval, 255, THRESH_BINARY_INV);
}
void toggle(int key)
{
//toggle line start
if (key == 'm')
domorph = !domorph;
if (key == 'b')
doblurthresh = !doblurthresh;
if (key == 'r')
showchangedframe = !showchangedframe;
if (key == 'c')
showcontours = !showcontours;
if (key == 'h')
showhull = !showhull;
//toggle line end
}
void showimgcontours(Mat &threshedimg, Mat &original)
{
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
int largest_area = 0;
int largest_contour_index = 0;
findContours(threshedimg, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
vector<vector<Point> >hull(contours.size());
//find a hull for each contour
for (int i = 0; i < contours.size(); i++)
{
convexHull(Mat(contours[i]), hull[i], false);
}
//this will find the largest contour
for (int i = 0; i< contours.size(); i++) // iterate through each contour.
{
double a = contourArea(contours[i], false); // Find the area of each contour
if (a>largest_area)
{
largest_area = a;
largest_contour_index = i; //Store the index of the largest contour
}
}
//search for the largest contour has end
if (contours.size() > 0)
{
drawContours(original, contours, largest_contour_index, CV_RGB(0, 255, 0), 2, 8, hierarchy);
//if you want to show every contour, use the following
//drawContours(original,-1, CV_RGB(0, 255, 0), 2, 8, hierarchy);
if (showhull)
drawContours(original, hull, largest_contour_index, CV_RGB(0, 0, 255), 2, 8, hierarchy);
//if you want to show every hull(s), use the following
//drawContours(original,-1, CV_RGB(0, 255, 0), 2, 8, hierarchy);
}
}
问题是,每当我尝试运行 findcontours() 函数时,它总是会在 vector 类模板中触发断点(void Tidy()
中的某处)。弹出对话框并显示以下消息:
“ConsoleApplication2.exe 中 0x00007FF9374CD328 (ucrtbase.dll) 处的未处理异常:将无效参数传递给认为无效参数致命的函数。”
然后对话框将我重定向到 vector 类模板并在下面的第 7 行显示一个断点。
void _Tidy()
{ // free all storage
if (this->_Myfirst() != pointer())
{ // something to free, destroy and deallocate it
this->_Orphan_all();
_Destroy(this->_Myfirst(), this->_Mylast());
this->_Getal().deallocate(this->_Myfirst(),
this->_Myend() - this->_Myfirst());
this->_Myfirst() = pointer();
this->_Mylast() = pointer();
this->_Myend() = pointer();
}
}
这是 findContours 函数或 vector 类的问题还是完全不同的问题?
最佳答案
这可能是一个简单的链接问题。
如果您在调试模式下编译,链接器需要输入变量opencv_world310d.lib
而不是opencv_world310.lib
(注意d
点之前)。
只有在编译Release模式时才需要输入opencv_world310.lib
。
我遇到了同样的问题。花了我一天的时间才弄清楚。
关于c++ - Opencv 3.0.0、C++、Visual Studio 2015 - 查找轮廓和 ConvexHull 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32160401/
我想根据我使用的 visual studio 版本编译不同的东西,比如 #if VISUAL_STUDIO_VERSION > 2015 eventH?.Invoke(this, EventArgs.
在 Visual Studio 2010 中调试并将鼠标悬停在变量名称上时,我可以选择使用 3 种不同的内置可视化工具:文本、XML 和 HTML。 这是我所指的示例: 由于我越来越多地使用基于 JS
我将可视化编程语言理解为允许程序员在屏幕上操作图形(而不是文本)对象以构建功能的语言。 我在 C#、VB 等中看到的最接近的东西是 RAD 控件,但这只是组成 UI 和最简单的功能——甚至与语言本身无
我目前正在使用 Visual Studio 2015 来编程 ASP.NET Core 应用程序。我对安装 Visual Studio 2017 有以下疑问: 什么被认为是最佳实践和/或最干净的方法?
尝试从扩展和更新获取 Visual Studio 扩展时,出现以下错误:- 向 visualstudiogallery.msdn.microsoft.com/Services/VStudio/Exte
我已经开发了Windows服务,并且该服务正在我的帐户下在本地计算机上运行。当我尝试通过在Visual Studio 2008中将其作为一个过程附加该服务来调试该服务时,我得到“无法附加到该过程。 V
作为标准安装的一部分,Visual Studio Code 带有一个名为“Monokai Dimmed”的颜色主题。 有没有办法将它移植到 Visual Studio 2015?我检查了社区主题( h
Visual Studio Community Edition是否可以使用Visual Studio Online帐户上的存储库? 我一直为包含在Online帐户中的Visual Studio Onl
我正在使用文本可视化工具在 Visual Studio 中调试字符串变量。然而,似乎字符串中间的大部分不见了。这背后的原因是什么? 最佳答案 Visual Studio 中的 Text Visuali
我正在开始一个涉及使用多个 SDK 的新项目,包括: 英特尔凌动开发者 SDK 文本转语音 SDK(建议?) 某种网络摄像头和增强现实支持(建议?) 我目前有 2008,但我也可以安装 2010。是否
我想知道,如果我发送一个解决方案文件夹(它是用 visual studio C# 编写的),您可以在 visual studio for mac 中打开解决方案吗? 在visual studio 20
有没有办法在 Visual Studio Code 和 Visual Studio 中设置相同的快捷方式(而不必每次都手动更改它们)? 例如,我在 Visual Studio Code 中经常使用 A
我无法启用 实时可视化树 在 Visual Studio 2017 用于 UWP 应用程序 (C#)。这个工具在 VS2015 上工作,但在 VS2017 中从来没有为我工作过。它对我的 WPF 项目
我刚开始了解 Visual Studio Code。我想知道,我可以将 Visual Studio 替换为所有 .NET 开发相关的工作吗? 我可以节省 Visual Studio 许可的成本吗? V
我安装了具有有效许可证(Visual Studio 订阅)的 Visual Studio 2019 企业版(VS 2019 16.1.4),它运行良好。 突然之间,当我尝试打开项目或项目中的任何文件时
Visual Studio 2015 Pro 提供以下 错误 : error BC36716: Visual Basic 9.0 does not support implicit line cont
我正在我的 PC 中使用 .net Framework 2.0 和 Visual C#(Microsoft Visual Studio 2008)开发 Windows 应用程序。 完成我的项目后,我必
有什么方法可以在启动 VS 时禁用 VA X 并仅在需要时将其重新打开?因为它会导致一些滞后。我似乎在 VS 的选项或 VA 的选项中都找不到该选项。 最佳答案 持shift在 Visual Stud
我可以将 Visual Studio 命令提示符 与免费的 Visual C# Express 一起使用吗? Visual Studio 命令提示符 被引用 here : Run 'Visual St
这很容易成为 Visual Studio 历史上最烦人的“功能”之一,我不明白它为什么存在 -- 曾经 . 为什么 CodePlex 项目需要关心我使用的是什么版本的 Visual Studio? 在
我是一名优秀的程序员,十分优秀!