我有一个椭圆,由中心点,radiusX和radiusY定义,我有一个Point.我想在椭圆上找到最接近给定点的点.在下图中,那将是S1.
现在我已经有了代码,但在其中的某个地方存在逻辑错误,我似乎无法找到它.我将问题分解为以下代码示例:
#include <vector>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <math.h>
using namespace std;
void dostuff();
int main()
{
dostuff();
return 0;
}
typedef std::vector<cv::Point> vectorOfCvPoints;
void dostuff()
{
const double ellipseCenterX = 250;
const double ellipseCenterY = 250;
const double ellipseRadiusX = 150;
const double ellipseRadiusY = 100;
vectorOfCvPoints datapoints;
for (int i = 0; i < 360; i+=5)
{
double angle = i / 180.0 * CV_PI;
double x = ellipseRadiusX * cos(angle);
double y = ellipseRadiusY * sin(angle); …
Run Code Online (Sandbox Code Playgroud) 我正在尝试在工作线程的事件循环中启动计时器,但出现此错误:
QObject::startTimer: Timers can only be used with threads started with QThread
这有什么问题?
#include <QObject>
#include <QThread>
#include <QTimer>
class A : public QObject
{
Q_OBJECT
public:
A();
private:
QThread m_workerThread;
QTimer m_myTimer;
};
A::A()
{
this->moveToThread(&m_workerThread);
m_myTimer.moveToThread(&m_workerThread);
m_workerThread.start();
m_myTimer.start(1000);
}
Run Code Online (Sandbox Code Playgroud) 我目前正在使用QLabel来执行此操作,但这似乎很慢:
void Widget::sl_updateLiveStreamLabel(spImageHolder_t _imageHolderShPtr) //slot
{
QImage * imgPtr = _imageHolderShPtr->getImagePtr();
m_liveStreamLabel.setPixmap( QPixmap::fromImage(*imgPtr).scaled(this->size(), Qt::KeepAspectRatio, Qt::FastTransformation) );
m_liveStreamLabel.adjustSize();
}
Run Code Online (Sandbox Code Playgroud)
在这里,我为到达的每个新图像生成一个新的QPixmap对象。由于QPixmap操作仅限于GUI线程,因此这也使GUI感觉响应较差。
我已经看到了关于此的一些讨论,其中大多数建议使用QGraphicsView或QGLWidget,但是我无法找到一个快速的示例来说明如何正确使用它们,这正是我所寻找的。
我将不胜感激。
local_bh_disable
禁用对下半部分 (softirqs) 的处理。Softirq 在中断返回路径上处理,或者由 ksoftirqd-(per cpu)-thread 处理,如果系统遭受沉重的 softirq 负载,它将被唤醒。
preempt_disable
禁用抢占,这意味着当线程在preempt_disable
<->preemt_enable
范围内执行时,它不会被调度程序置于睡眠状态。这意味着,如果在当前线程在该范围内时发生系统定时器中断,它可能会更新调度程序的会计表,但它不会将上下文切换到另一个线程。这包括软中断。
local_irq_disable
或local_irq_save
禁用本地 cpu 的中断。这意味着本地 cpu 不会对任何 irq 做出反应,因此它不会运行任何中断返回路径,因此无法在那里运行软中断。
假设我的上述陈述是正确的(我不确定),那么在local_bh_disable
您调用preempt_disable
and local_irq_save
(在进程上下文中)之后调用不是多余的吗?
我有一个熔炼立方体的图像,随着时间的推移形成一个液滴.到目前为止,我提取了它的轮廓,但接下来我需要区分物体和表面.我的想法是检测物体接触表面的角落,但我很难找到一个合理的方法如何这样做(最好使用opencv的c ++接口).我很感激任何建议.
以下是提取轮廓的一些示例:
编辑:@Haris:
我试过你的建议的一个变种,它正在为我做的工作:
在近似轮廓i中,从左侧接近,查找具有指定范围内的值的第一个角度,然后从右侧查找相同的角度.由于近似轮廓点是原始轮廓点的子集,然后我识别原始序列中的2个角点,并在两个角处切割它.中间部分我作为液滴,左右部分,我重新定位为我的表面线.可能有更好,更稳定的方法,但这对我有用.谢谢!
在文档中它说:
在多线程应用程序中,您可以
QTimer
在任何具有事件循环的线程中使用。要从非 GUI 线程启动事件循环,请使用QThread::exec()
. Qt 使用计时器的线程关联来确定哪个线程将发出信号timeout()
。因此,您必须在其线程中启动和停止计时器;不可能从另一个线程启动计时器。
因此,当我有一个QTimer
对象时,Qt 使用该对象(或其父级)的线程亲和力来确定哪个线程将发出信号timeout()
。但是,当我使用不需要实例的
静态成员函数时,会发生什么情况,哪个线程会发出超时信号呢?singleShot(..)
QTimer
为什么我得到这个:
error: invalid application of 'sizeof' to incomplete type 'A'
Run Code Online (Sandbox Code Playgroud)
当我尝试这样做时:
class A
{
int m_i;
static char m_j[sizeof(A)];
};
Run Code Online (Sandbox Code Playgroud)
我假设在这种情况下很明显sizeof(A)将是sizeof(int).但我的编译器似乎并不这么认为.