【1】关于如何在C++中调用Python脚本,并在python中对话框选中文件传输问题

0 需求

需求:在C++写的Qt界面中,调用Python程序实现图像信息统计,但是需要手动对话框选择文件,并传输路径。

1 整体思路

(1)、第一种方法是在Qt中调用对话框选择图片(QFileDialog::getOpenFileName),然后将路径做为参数传输至(QProcess::execute)。

(2)、第二种方法是在Python中调用对话框选择图片的函数,获取路径字符串,在进行后续统计。

2、先上结论(亲测好用)

最终选用第二种方法,用tkinter调用GUI获取图片路径,然后再调用opencv进行显示,代码如下:

import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np

import tkinter as tk
from tkinter import filedialog
FilePath = filedialog.askopenfilename(title='Select a image', initialdir='./')
src = cv.imread(FilePath)
cv.namedWindow('src')
cv.imshow('src',src)
cv.waitKey()
cv.destroyAllWindows()
print(FilePath)

3、踩到的坑

<1>、基于C++的Qt在获取文件路径方面没有问题,关键是传输到Python文件时,很麻烦,报错且没有解决并且不知道QString,是否和Python的String出现冲突,部分C++代码如下:

    QString OpenFile, OpenFilePath;
    OpenFile = QFileDialog::getOpenFileName(this,
           "please choose an image file",
           "",
           "Image Files(*.jpg *.png *.bmp *.pgm *.pbm);;All(*.*)");
    Mat src = imread(OpenFile.toStdString());
    namedWindow("src");
    //imshow("src",src);
    QProcess::startDetached("python ./Analyze.py",OpenFile);

报错如下:

 error: no matching function for call to 'execute'

<2> 在Python主程序调用Pyqt5的打开文件出现异常退出,并没有显示选择框。

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import cv2
import sys

OpenFilePath = QFileDialog.getOpenFileName(None)
print(OpenFilePath)

报错如下:

Process finished with exit code -1073740791 (0xC0000409)

4、最终解决与参考

最终解决如2所示,用的tkinter,另外,tkinter是系统自带,不需要pip;
参考这个方法
1、tkinter打开文件
2、具体参数

你可能感兴趣的:(辅助工具,c++,python,opencv,qt,pyqt)