PPT.cpp

#include "PPT.h"
#include<Windows.h> 
#include <QWindow>
#include <QMouseEvent>

#include <QtGui>
#include <QMessageBox>

HHOOK keyHook = NULL;
HHOOK mouseHook = NULL;

//声明卸载函数,以便调用
void unHook();
//键盘钩子过程
LRESULT CALLBACK keyProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    //在WH_KEYBOARD_LL模式下lParam 是指向KBDLLHOOKSTRUCT类型地址
    KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *)lParam;
    if (pkbhs->vkCode == VK_F12)
    {
        unHook();
        qApp->quit();
    }
    return 0;//返回1表示截取消息不再传递,返回0表示不作处理,消息继续传递
}

//鼠标钩子过程
LRESULT CALLBACK mouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{

    tagMSLLHOOKSTRUCT* pkbhs = (tagMSLLHOOKSTRUCT *)lParam;
    qDebug() << "Hook1";
    if (wParam == WM_LBUTTONDOWN || wParam == WM_LBUTTONUP)
    {
        //unHook();
        //qApp->quit();
    }
    return 0; 

    //unHook();
    //QMessageBox::information(NULL, "提示", "mouseProc", QMessageBox::Accepted);
    //qApp->quit();
    //return 0;
}

//卸载钩子
void unHook()
{
    UnhookWindowsHookEx(keyHook);
    UnhookWindowsHookEx(mouseHook);
}
//安装钩子,调用该函数即安装钩子
void setHook()
{//这两个底层钩子,不要DLL就可以全局
    //底层键盘钩子
    keyHook = SetWindowsHookEx(WH_KEYBOARD_LL, keyProc, GetModuleHandle(NULL), 0);
    //底层鼠标钩子
    mouseHook = SetWindowsHookEx(WH_MOUSE_LL, mouseProc, GetModuleHandle(NULL), 0);
}

PPT::PPT(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

    pptApp = new PowerPoint::Application();
    presentations = pptApp->Presentations();

    if (presentations != NULL)
    {
        presentation = static_cast<PowerPoint::Presentation*>(presentations->querySubObject("Open(QString&)", "D:\\test.pptx"));

        slideshow = static_cast<PowerPoint::SlideShowSettings*>(presentation->querySubObject("SlideShowSettings()"));

        slideshow->Run();
        slideShowWindow = static_cast<PowerPoint::SlideShowWindow*>(presentation->querySubObject("SlideShowWindow()"));
    }

    WId wid = (WId)FindWindow(L"screenClass", NULL);

    //第三步:获取QWindow
    QWindow *m_window;
    m_window = QWindow::fromWinId(wid);
    m_window->setFlags(m_window->flags() | Qt::CustomizeWindowHint | Qt::WindowTitleHint); //这边可以设置一下属性
    //第四步:获取代理QWidget

    m_widget = QWidget::createWindowContainer(m_window,this); //第二个参数是作为window的父类,也可以用layout,此处就不解释了
    setCentralWidget(m_widget);

    slideShowView = static_cast<PowerPoint::SlideShowView*>(slideShowWindow->querySubObject("View()"));

    SetParent(FindWindow(L"screenClass", NULL), (HWND)(m_widget->winId()));

    m_widget->setFocus();

    //setHook();
}
bool PPT::eventFilter(QObject *target, QEvent *event)
{
    qDebug("eventFilter");
    if ((QWidget*)target == upWidget)
    {
        qDebug("The imageWidget generate the event!");
        if (event->type() == QEvent::MouseButtonPress)
        {
            QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
            //if (mouseEvent->buttons() & Qt::LeftButton)
            //{
            //  qDebug("The Left Button Event!");
            //  slideShowWindow = static_cast<PowerPoint::SlideShowWindow*>(presentation->querySubObject("SlideShowWindow()"));
            //  slideShowView = static_cast<PowerPoint::SlideShowView*>(slideShowWindow->querySubObject("View()"));

            //  SetCursorPos(500, 0);//这个坐标是“开始”这个菜单在我当前电脑屏幕上的位置,大家可以自己去获取  
            //  mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, NULL);//鼠标down事件  
            //  mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, NULL);//鼠标up事件

            //  //QAxWidget* slideShowWindowWidget  = static_cast<QAxWidget*>(presentation->querySubObject("SlideShowWindow()"));
            //  //slideShowWindow->mousePressEvent( (QMouseEvent *)event); 

            //  //slideShowView.Next();
            //  //slideShowView->dynamicCall("Next()");

            //}

            slideShowView->dynamicCall("Next()");
            return true;
        }
    }

    //其它部件产生的事件则交给基类处理  
    return QWidget::eventFilter(target, event);
}

void PPT::onNext()
{
    /*QPoint pos(403, 34);
    QMouseEvent event0(QEvent::MouseButtonPress, pos, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
    QApplication::sendEvent(this, &event0);*/

    slideShowView->dynamicCall("Next()");
}

// 鼠标按下事件
void PPT::mousePressEvent(QMouseEvent *event)
{
    // 如果是鼠标左键按下   改变指针形状,并且存储当前指针位置与窗口位置的差值。
    if (event->button() == Qt::LeftButton)
    {
    }

}


你给我的代码出现了这些问题,改正之后给我严重性 代码 说明 项目 文件 行 禁止显示状态 详细信息 错误 C2146 语法错误: 缺少“;”(在标识符“cv2”的前面) testOpenCV D:\C\testOpenCV\testOpenCV\FileName.cpp 1 错误 C4430 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int testOpenCV D:\C\testOpenCV\testOpenCV\FileName.cpp 2 错误(活动) E0020 未定义标识符 "import" testOpenCV D:\C\testOpenCV\testOpenCV\FileName.cpp 1 错误(活动) E0011 无法识别的预处理指令 testOpenCV D:\C\testOpenCV\testOpenCV\FileName.cpp 4 错误(活动) E0011 无法识别的预处理指令 testOpenCV D:\C\testOpenCV\testOpenCV\FileName.cpp 7 错误(活动) E0011 无法识别的预处理指令 testOpenCV D:\C\testOpenCV\testOpenCV\FileName.cpp 10 错误(活动) E0011 无法识别的预处理指令 testOpenCV D:\C\testOpenCV\testOpenCV\FileName.cpp 13 错误(活动) E0011 无法识别的预处理指令 testOpenCV D:\C\testOpenCV\testOpenCV\FileName.cpp 16 错误(活动) E0011 无法识别的预处理指令 testOpenCV D:\C\testOpenCV\testOpenCV\FileName.cpp 29 错误(活动) E0011 无法识别的预处理指令 testOpenCV D:\C\testOpenCV\testOpenCV\FileName.cpp 32 错误(活动) E0011 无法识别的预处理指令 testOpenCV D:\C\testOpenCV\testOpenCV\FileName.cpp 38 错误 C1021 无效的预处理器命令“读取图像” testOpenCV D:\C\testOpenCV\testOpenCV\FileName.cpp 4 错误(活动) E0065 应输入“;” testOpenCV D:\C\testOpenCV\testOpenCV\FileName.cpp 2 错误(活动) E0026 字符常量中的字符过多 testOpenCV D:\C\testOpenCV\testOpenCV\FileName.cpp 5 错误(活动) E0026 字符常量中的字符过多 testOpenCV D:\C\testOpenCV\testOpenCV\FileName.cpp 39
最新发布
11-28
<think> 我们注意到用户的问题是关于修正OpenCV代码中的编译错误(C2146, C4430, E0020等)。这些错误通常是由于C++代码中的语法错误或缺少必要的头文件和命名空间引起的。根据引用[1]和引用[2],错误可能源于OpenCV版本更新导致的标识符变更,以及缺少必要的头文件。 用户提供的代码是Python代码,但错误信息(C2146, C4430)是C++编译器错误。因此,我们推断用户可能混淆了编程语言,或者用户实际上是在编写C++程序。 根据用户描述的错误: - C2146: 语法错误: 缺少“;”(在标识符“cv2”前) -> 这通常发生在C++中,因为C++要求每行语句以分号结尾,并且变量需要类型声明。 - C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int -> 同样也是C++编译错误。 - E0020: 未定义标识符“import” -> 在C++中,没有import关键字(Python中使用import)。 因此,我们判断用户可能试图在C++环境中运行Python代码,这是行不通的。 解决方案: 如果用户想要使用Python,那么应该确保在Python环境中运行,并使用正确的Python语法(不需要分号,使用import导入模块)。 如果用户想要使用C++,那么需要将代码改写为C++版本。 我们注意到用户之前的问题是关于OpenCV进行车牌识别和车道识别的,并且提供了两个Python代码框架。但是,用户现在要求修正C++编译错误。 因此,我们将提供两种修正: 1. 如果用户是想要Python代码,那么之前的代码框架是正确的,但需要确保在Python环境中运行,并且安装了OpenCV的Python库(如cv2)。 2. 如果用户想要C++代码,那么我们将把之前的Python代码改写为C++代码,并注意引用[2]中提到的头文件问题(特别是对于cvtColor中颜色转换常量的使用)。 根据引用[2]中的解决方案,在C++中使用颜色转换常量时,可能需要包含头文件`<opencv2/imgproc/types_c.h>`,并且在OpenCV3及以上版本中,有些常量已经改变了(如`CV_RGB2GRAY`改为`cv::COLOR_BGR2GRAY`)。因此,我们使用新的常量(以`COLOR_`开头)并包含正确的头文件。 由于用户没有明确说明,但错误信息是C++的,这里我们提供C++版本的车牌识别和车道识别的代码框架,并修正编译错误。 注意:以下C++代码框架仅用于示例,实际应用中可能需要更多的优化和错误处理。 车牌识别C++代码框架(修正编译错误): */ #include <opencv2/opencv.hpp> #include <opencv2/imgproc.hpp> // 包含图像处理函数 #include <opencv2/imgproc/types_c.h> // 为了兼容一些旧的常量,但建议使用新的常量 using namespace cv; int main() { // 读取图像 Mat image = imread("car_image.jpg"); if (image.empty()) { printf("Could not open or find the image\n"); return -1; } Mat gray; // 灰度化 - 使用新的常量COLOR_BGR2GRAY(OpenCV3及以上版本) cvtColor(image, gray, COLOR_BGR2GRAY); // 边缘检测 Mat edges; Canny(gray, edges, 50, 150); // 查找轮廓 std::vector<std::vector<Point>> contours; std::vector<Vec4i> hierarchy; findContours(edges, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE); // 筛选可能的车牌区域 std::vector<std::vector<Point>> plate_contours; for (size_t i = 0; i < contours.size(); i++) { double perimeter = arcLength(contours[i], true); std::vector<Point> approx; approxPolyDP(contours[i], approx, 0.02 * perimeter, true); if (approx.size() == 4) { plate_contours.push_back(approx); } } // 绘制可能的车牌区域 for (size_t i = 0; i < plate_contours.size(); i++) { drawContours(image, plate_contours, (int)i, Scalar(0, 255, 0), 2); } // 显示结果 imshow("License Plate Detection", image); waitKey(0); destroyAllWindows(); return 0; } /* 车道识别C++代码框架(修正编译错误): */ #include <opencv2/opencv.hpp> #include <opencv2/imgproc.hpp> using namespace cv; int main() { // 读取图像 Mat image = imread("road_image.jpg"); if (image.empty()) { printf("Could not open or find the image\n"); return -1; } Mat gray; cvtColor(image, gray, COLOR_BGR2GRAY); // 高斯模糊 Mat blur; GaussianBlur(gray, blur, Size(5, 5), 0); // 边缘检测 Mat edges; Canny(blur, edges, 50, 150); // 定义感兴趣区域 Mat mask = Mat::zeros(edges.size(), edges.type()); Point roi_vertices[1][4]; int height = edges.rows; int width = edges.cols; roi_vertices[0][0] = Point(0, height); roi_vertices[0][1] = Point(width / 2 - 50, height / 2 + 50); roi_vertices[0][2] = Point(width / 2 + 50, height / 2 + 50); roi_vertices[0][3] = Point(width, height); const Point* ppt[1] = { roi_vertices[0] }; int npt[] = { 4 }; fillPoly(mask, ppt, npt, 1, Scalar(255)); Mat masked_edges; bitwise_and(edges, mask, masked_edges); // 霍夫变换检测直线 std::vector<Vec4i> lines; HoughLinesP(masked_edges, lines, 1, CV_PI / 180, 50, 50, 100); // 参数调整 // 绘制车道线 for (size_t i = 0; i < lines.size(); i++) { Vec4i l = lines[i]; line(image, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 255, 0), 2); } // 显示结果 imshow("Lane Detection", image); waitKey(0); destroyAllWindows(); return 0; } /* 注意: 1. 在OpenCV3及以上版本中,颜色转换常量从CV_前缀改为了COLOR_前缀(如COLOR_BGR2GRAY)。 2. 包含头文件:<opencv2/imgproc.hpp> 和 <opencv2/opencv.hpp> 通常足够。 3. 对于旧的常量(如CV_PI),我们仍然可以使用,因为它们通常被定义为宏。 4. 在C++中,使用命名空间using namespace cv;可以避免重复写cv::。 如果用户确实想要Python代码,那么请确保使用Python环境并安装OpenCV-Python库。用户提供的错误是C++编译错误,所以这里我们主要提供C++的修正。 如果用户仍然遇到问题,请检查OpenCV的安装版本以及包含的头文件路径。 生成相关问题: */ </think> 针对代码中的编译错误(C2146、C4430、E0020),以下是修正后的C++版OpenCV车牌/车道识别代码。主要修正点包括: 1. **Python到C++转换**:原Python代码需完全重写为C++语法 2. **头文件包含**:添加必要的OpenCV头文件 3. **命名空间**:使用`cv::`前缀或`using namespace cv` 4. **常量更新**:使用新版OpenCV常量(如`cv::COLOR_BGR2GRAY`替代`CV_RGB2GRAY`) 5. **语法修正**:添加分号、类型声明等C++必需语法 ### 修正后的车牌识别代码 ```cpp #include <opencv2/opencv.hpp> #include <opencv2/imgproc.hpp> int main() { // 读取图像 cv::Mat image = cv::imread("car_image.jpg"); if(image.empty()) return -1; // 灰度化 - 使用新的COLOR常量 cv::Mat gray; cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY); // 边缘检测 cv::Mat edges; cv::Canny(gray, edges, 50, 150); // 查找轮廓 std::vector<std::vector<cv::Point>> contours; std::vector<cv::Vec4i> hierarchy; cv::findContours(edges, contours, hierarchy, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE); // 筛选可能的车牌区域 std::vector<std::vector<cv::Point>> plate_contours; for (const auto& contour : contours) { double perimeter = cv::arcLength(contour, true); std::vector<cv::Point> approx; cv::approxPolyDP(contour, approx, 0.02 * perimeter, true); if (approx.size() == 4) { plate_contours.push_back(approx); } } // 绘制车牌区域 for (const auto& plate : plate_contours) { std::vector<std::vector<cv::Point>> drawContours = {plate}; cv::drawContours(image, drawContours, -1, cv::Scalar(0, 255, 0), 2); } // 显示结果 cv::imshow("License Plate Detection", image); cv::waitKey(0); return 0; } ``` ### 修正后的车道识别代码 ```cpp #include <opencv2/opencv.hpp> #include <opencv2/imgproc.hpp> int main() { // 读取图像 cv::Mat image = cv::imread("road_image.jpg"); if(image.empty()) return -1; // 灰度化 cv::Mat gray; cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY); // 高斯模糊 cv::Mat blur; cv::GaussianBlur(gray, blur, cv::Size(5, 5), 0); // 边缘检测 cv::Mat edges; cv::Canny(blur, edges, 50, 150); // 定义感兴趣区域 cv::Mat mask = cv::Mat::zeros(edges.size(), edges.type()); int height = edges.rows; int width = edges.cols; cv::Point roi_vertices[4] = { cv::Point(0, height), cv::Point(width/2 - 50, height/2 + 50), cv::Point(width/2 + 50, height/2 + 50), cv::Point(width, height) }; cv::fillConvexPoly(mask, roi_vertices, 4, cv::Scalar(255)); cv::Mat masked_edges; cv::bitwise_and(edges, mask, masked_edges); // 霍夫变换检测直线 std::vector<cv::Vec4i> lines; cv::HoughLinesP(masked_edges, lines, 1, CV_PI/180, 50, 50, 100); // 绘制车道线 for (const auto& line : lines) { cv::line(image, cv::Point(line[0], line[1]), cv::Point(line[2], line[3]), cv::Scalar(0, 255, 0), 2); } // 显示结果 cv::imshow("Lane Detection", image); cv::waitKey(0); return 0; } ``` ### 关键修正说明: 1. **头文件问题**: ```cpp #include <opencv2/opencv.hpp> // 包含核心功能 #include <opencv2/imgproc.hpp> // 包含图像处理函数 ``` 2. **常量更新**(OpenCV 3.x+): ```cpp // 旧版: CV_RGB2GRAY → 新版: cv::COLOR_BGR2GRAY cv::cvtColor(src, dst, cv::COLOR_BGR2GRAY); ``` 3. **轮廓检测API变更**: ```cpp // 新版findContours返回轮廓和层级关系 cv::findContours(..., contours, hierarchy, ...); ``` 4. **ROI多边形绘制**: ```cpp // 使用fillConvexPoly替代fillPoly cv::fillConvexPoly(mask, vertices, count, color); ``` > **编译注意事项**:确保链接正确的OpenCV库,使用C++11及以上标准编译: > ```bash > g++ plate_recognition.cpp -o plate_recognition `pkg-config --cflags --libs opencv4` > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值