C++ 主函数跳过线程,不连接以显示所需的输出

C++ 主函数跳过线程,不连接以显示所需的输出,c++,multithreading,opencv,C++,Multithreading,Opencv,函数ProcessFrames接收图像的一个象限,并对其应用Canny过滤器。但是,创建的线程不会发出一个精明的检测图像。相反,我在imshow()中获得图像的颜色象限 std::thread构造函数复制所有内容。 如果要传递数据指针并在线程中更改此数据,则必须使用std::ref()std::thread构造函数复制所有内容。 如果要传递数据指针并在线程中更改此数据,则必须使用std::ref()将其包装起来。如果只是尝试异步运行函数,则应阅读相关内容。如果之后立即加入线程,为什么还要创建线程

函数ProcessFrames接收图像的一个象限,并对其应用Canny过滤器。但是,创建的线程不会发出一个精明的检测图像。相反,我在imshow()中获得图像的颜色象限


std::thread
构造函数复制所有内容。
如果要传递数据指针并在线程中更改此数据,则必须使用
std::ref()

std::thread
构造函数复制所有内容。
如果要传递数据指针并在线程中更改此数据,则必须使用
std::ref()

将其包装起来。如果只是尝试异步运行函数,则应阅读相关内容。如果之后立即加入线程,为什么还要创建线程?是否使用MSV?复制<代码>标准::线程按值获取其参数,即使函数按引用获取参数。@FrançoisAndrieux它不按值获取参数。不幸的是,它所做的是将它们复制到线程的状态。如果只是尝试异步运行函数,则应该阅读相关内容。如果之后立即加入线程,为什么还要创建线程?是否使用MSV?复制<代码>标准::线程按值获取其参数,即使函数按引用获取参数。@FrançoisAndrieux它不按值获取参数。不幸的是,它所做的是将它们复制到线程的状态。
void ProcessFrames(Mat &image)
{
    Mat test = image;
    Canny(test, image, 5, 60, 3);
}

void main()
{
    Mat frame;
    Mat top_left, top_right, bot_left, bot_right;
    String filename = "C:\\Users\\operator\\Downloads\\MODFAM1080I.mpg";
    VideoCapture capture(filename);
    if (!capture.isOpened())
        throw "Error when reading video file!!";
    while (1)
    {
        capture >> frame;
        if (frame.empty())
        break;
        top_left = frame(Range(0, frame.rows / 2 - 1), Range(0, frame.cols / 2 - 1));
        top_right = frame(Range(0, frame.rows / 2 - 1), Range(frame.cols / 2, frame.cols - 1));
        bot_left = frame(Range(frame.rows / 2, frame.rows - 1), Range(0, frame.cols / 2 - 1));
        bot_right = frame(Range(frame.rows / 2, frame.rows - 1), Range(frame.cols / 2, frame.cols - 1));
        //Cropping the image into four quadrants to process it separately. 
        thread t1(ProcessFrames,top_left); //invoking a thread and passing first quadrant.
        t1.join(); //joing the thread with the main function
        imshow("Canny", top_left); // still shows color image of the first quadrant. Canny not reflected.
        cvWaitKey(10);
    }
}