0

はい、私はこれのための関数があることを知っていますが、これはOpenCVの基本を学ぶための(非常に単純な)関数です。

擬似コードを5回チェックしましたが、これは論理的なエラーではないと確信しています。

#include <stdio.h>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;

int main(int argc, const char *argv[])
{
    if (argc!=2 || argv[1]=="") {
        printf("No image specified.");
        exit(-1);
    }
    Mat im, out;
    const string fn = argv[1];

    im = cv::imread(fn);
    out.create(im.cols, im.rows, CV_8UC3);

    //int tmp = 0;
    for (int i = 0; i < out.rows; i++) {
        for (int j = 0; j < out.cols; j++) {
            out.at<cv::Vec3d>(i, j) = im.at<cv::Vec3d>(im.rows-1-j, i);
            /*
             *if (tmp<1000) {tmp++;}
             *else {imwrite("/tmp/out.png", out); tmp=0;}
             */
        }
    }

    imwrite("/tmp/in.png", im);
    imwrite("/tmp/out.png", out);

    return 0;
}

結果

アウト画像の幅がちょうど3倍に伸びていることに気づきました(1px→3px)。
さらに、リターンでのセグメンテーション違反。

アップデート:

擬似コードは次のとおりです。

for(row=0; row<out.rows; row++) {
    for(col = 0; col<out.cols; col++) {
        out[row][col] = in[(in.rows-1)-col][row];
    }
}
4

1 に答える 1

2

画像をグレースケール画像として読み取っていますcv::imread(name, 0)

これを次のように変更する必要cv::imread(name, 1)があります。それ以外の場合は使用できませんim.at<cv::Vec3b>(i, j)(unsigned charを表すのではなく、に注意してVec3bください。これはdoubleを意味します)Vec3dbd

于 2013-02-21T13:22:04.867 に答える