c++ - 将图片旋转 90 度时复制像素 [Vec3d vs Vec3b]

标签 c++ opencv rotation segmentation-fault

是的,我知道有一个函数,但这是学习 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;
}

Result

我注意到out图片的宽度正好被拉伸(stretch)了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];
    }
}

最佳答案

您正在读取图像作为灰度图像:cv::imread(name, 0) .

您应该将其更改为:cv::imread(name, 1) , 否则你不能使用 im.at<cv::Vec3b>(i, j) (注意 Vec3b ,而不是 Vec3d,其中 b 代表无符号字符,d 代表 double )

关于c++ - 将图片旋转 90 度时复制像素 [Vec3d vs Vec3b],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15002294/

相关文章:

c++ - GOTO 还是不 GOTO?

c++ - 如何合并两个排序的 vector 并组合重叠元素?

OpenCV::projectPoints 的 Java 实现在这个基本示例中似乎被破坏了

python - 导入错误 : No module named opencv. 简历

animation - 鼠标悬停时CSS3背景旋转动画

c++ - 在 getline 上检查 eof() 即 while(!getline().eof()) 和简单检查 while(getline()) 有什么区别

opencv - 如何在opencv 2.4.9中启用findEssentialMat?

iphone - 如何在 ios 7 中阻止旋转

java - 如何在不使用微 Controller 的情况下使用 Java/.net/c 旋转电机

c++ - QAction 信号槽中的隐形 UI