0

是的,我知道有一个功能,但这是学习 OpenCV 基础知识的(非常简单的)功能。

我检查了伪代码五次,很确定这不是逻辑错误。

#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)注意Vec3b, 而不是Vec3d, 其中b代表无符号字符,d表示双精度)

于 2013-02-21T13:22:04.867 回答