Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用OpenCV C+查找已知对象+;_C++_Opencv - Fatal编程技术网

C++ 使用OpenCV C+查找已知对象+;

C++ 使用OpenCV C+查找已知对象+;,c++,opencv,C++,Opencv,我是OpenCV的新手。我正在VisualStudio2013的Windows10上使用OpenCV-2.4.12。我正在尝试创建一个程序,将2个图像作为输入,并尝试在第2个图像中找到类似的第一个图像块。通过查找特征和单应性。。基本上我是在学习教程。并成功地实现了代码。所以我想让事情更进一步,我想裁剪匹配的块。。。因此,我成功地创建了一个掩码图像,但是当我尝试按位_和或类似的东西时,它显示了以下错误 Unhandled exception at 0x772FD928 in OpenCVTut.e

我是OpenCV的新手。我正在VisualStudio2013的Windows10上使用OpenCV-2.4.12。我正在尝试创建一个程序,将2个图像作为输入,并尝试在第2个图像中找到类似的第一个图像块。通过查找特征和单应性。。基本上我是在学习教程。并成功地实现了代码。所以我想让事情更进一步,我想裁剪匹配的块。。。因此,我成功地创建了一个掩码图像,但是当我尝试按位_和或类似的东西时,它显示了以下错误

Unhandled exception at 0x772FD928 in OpenCVTut.exe Microsoft C++ exception: cv::Exception at memory location 0x0017E6C0.
我试过谷歌搜索很多。。。但是找不到任何解决办法。下面是代码,以及我正在使用的图像和我生成的掩码

#include <iostream>
#include <opencv2\opencv.hpp>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\features2d\features2d.hpp>
#include <opencv2\calib3d\calib3d.hpp>
#include <opencv2\features2d\features2d.hpp>
#include <opencv2\nonfree\nonfree.hpp>

using namespace std;
using namespace cv;


int main() {
    Mat imgObject = cvLoadImage("E:/opencv/images/Experiments/target.jpg", CV_LOAD_IMAGE_GRAYSCALE);
    Mat imgScene = cvLoadImage("E:/opencv/images/Experiments/source.jpg", CV_LOAD_IMAGE_GRAYSCALE);

    if (!imgObject.data || !imgScene.data) {
        cout << "Error reading images" << endl;

        return -1;
    }

    int minHessian = 400;
    SurfFeatureDetector detector(minHessian);
    vector<KeyPoint> keyPointsObject;
    vector<KeyPoint> keyPointsScene;

    detector.detect(imgObject, keyPointsObject);
    detector.detect(imgScene, keyPointsScene);

    SurfDescriptorExtractor extractor;
    Mat descriptorObject;
    Mat descriptorScene;

    extractor.compute(imgObject, keyPointsObject, descriptorObject);
    extractor.compute(imgScene, keyPointsScene, descriptorScene);

    FlannBasedMatcher matcher;
    vector<DMatch> matches;
    matcher.match(descriptorObject, descriptorScene, matches);

    double maxDist = 0;
    double minDist = 100;

    for (int i = 0; i < descriptorObject.rows; i++) {
        double dist = matches[i].distance;

        if (dist > maxDist) maxDist = dist;
        if (dist < minDist) minDist = dist;
    }

    cout << "-- Max dist : " << maxDist << endl;
    cout << "-- Min dist : " << minDist << endl;

    vector<DMatch> goodMatches;
    for (int i = 0; i < descriptorObject.rows; i++) {
        if (matches[i].distance < 3 * minDist) {
            goodMatches.push_back(matches[i]);
        }
    }

    /*Mat imgMatches;
    drawMatches(imgObject, keyPointsObject, imgScene, keyPointsScene,
        goodMatches, imgMatches, Scalar::all(-1), Scalar::all(-1),
        vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);*/

    vector<Point2f> obj;
    vector<Point2f> scene;

    for (int i = 0; i < goodMatches.size(); i++) {
        obj.push_back(keyPointsObject[goodMatches[i].queryIdx].pt);
        scene.push_back(keyPointsScene[goodMatches[i].trainIdx].pt);
    }

    Mat H = findHomography(obj, scene, CV_RANSAC);

    vector<Point2f> objCorners(4);
    objCorners[0] = cvPoint(0, 0);
    objCorners[1] = cvPoint(imgObject.cols, 0);
    objCorners[2] = cvPoint(imgObject.cols, imgObject.rows);
    objCorners[3] = cvPoint(0, imgObject.rows);

    vector<Point2f> sceneCorners(4);
    perspectiveTransform(objCorners, sceneCorners, H);

    line(imgScene, sceneCorners[0], sceneCorners[1], Scalar(0, 255, 0), 4);
    line(imgScene, sceneCorners[1], sceneCorners[2], Scalar(0, 255, 0), 4);
    line(imgScene, sceneCorners[2], sceneCorners[3], Scalar(0, 255, 0), 4);
    line(imgScene, sceneCorners[3], sceneCorners[0], Scalar(0, 255, 0), 4);

    Mat mask = Mat::zeros(imgScene.rows, imgScene.cols, CV_8UC3);
    vector< vector<Point> > contours;
    vector< Vec4i > hierarchy;

    Mat coun;
    imgScene.copyTo(coun);
    findContours(coun, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);

    Scalar color(255, 255, 255);
    drawContours(mask, contours, 0, color, CV_FILLED, 8, hierarchy);

    Mat element = getStructuringElement(MORPH_RECT, Size(2, 2), Point(0, 0));
    dilate(mask, mask, element);
    erode(mask, mask, element);

    Mat res(imgScene.rows, imgScene.cols, CV_8UC1, Scalar(0, 0, 0));
    bitwise_and(imgScene, mask, res);

    namedWindow("Good Matches & Object detection", CV_WINDOW_AUTOSIZE);
    imshow("Good Matches & Object detection", mask);

    waitKey(0);

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间cv;
int main(){
Mat imgObject=cvLoadImage(“E:/opencv/images/Experiments/target.jpg”,CV\u LOAD\u IMAGE\u GRAYSCALE);
Mat imgScene=cvLoadImage(“E:/opencv/images/Experiments/source.jpg”,CV\u LOAD\u IMAGE\u GRAYSCALE);
如果(!imgObject.data | |!imgScene.data){

cout错误发生在第行:

bitwise_and(imgScene, mask, res);
因为这两个矩阵的类型不同:
imgScene
是一个
CV_8UC1
矩阵,
mask
是一个
CV_8UC3

由于掩码通常只是一个二进制图像,可以用一个单通道矩阵安全地表示,因此您可以修复代码生成
mask
a
CV_8UC1
矩阵:

Mat mask = Mat::zeros(imgScene.rows, imgScene.cols, CV_8UC1); // Instead of CV_8UC3

您可以在抛出此异常时选中“中断”选项,然后查看为什么会为您自己抛出该异常。@StoryTeller。也尝试过了……如果有意义的话,我不会在这里提问……:p:“)……就像我说的……我对opencv很陌生,或者更可能是计算机视觉。请查找发生错误的代码行。使用debugger或std::偶尔会发出一条独特的消息。@Mika…我很确定错误在“按位”和(imgScene,mask,res);“这句话…谢谢你…你是个救生员:D很抱歉反应太晚,弄乱了一些配置…必须修复它…”真的感谢你的帮助…:)