作者amateuruser (U文心得大师)
看板C_and_CPP
标题[问题] opencv 搭配 C 写影像任意角度旋转
时间Thu Jun 15 11:37:01 2017
开发平台(Platform): (Ex: Win10, Linux, ...)
W10
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
Visual studio 2010
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
Opencv ver2.4.9
问题(Question):
无法正确执行结果
喂入的资料(Input):
任意jpg图片
预期的正确结果(Expected Output):
可以输入角度
正确输出旋转後的图片
错误结果(Wrong Output):
显示记忆体违规,不知道那里下手
程式码(Code):(请善用置底文网页, 记得排版)
#include " highgui.h"
#include <cv.h>
#include <math.h>
#include <stdio.h>
#include <Windows.h>
using namespace std;
void tran( unsigned char * frame_in, unsigned char * frame_out, int height, int width,int degree)
{
int x1,y1,i,j;
double pi=3.1415926;
double angle=degree*pi/180;
int x,y,z;
for(x=0; x<width; x++)
{
for(y=0;y<height; y++)
{
for(z=0;z<3;z++)
{
x1=i*cos(angle)-j*sin(angle);
y1=j*cos(angle)+i*sin(angle);
if((x1>=0)&&(x1<width)&&(y1>=0)&&(y1<height))
{
frame_out[(y*width+x)*3+z] = frame_in[(x1*width+y1)*3+z];
}else{
frame_out[(y*width+i)*3+z] = 0;
}
}
}
}
}
int main()
{
//
int degree;
printf("choose the degree to rotate the picture\n");
scanf("%d",°ree);
//
IplImage *Image1 ;
Image1=cvLoadImage("lena.jpg",1);
int height, width;
height = Image1->height;
width = Image1->width;
cvNamedWindow("Original Image", CV_WINDOW_AUTOSIZE);
cvShowImage("Original Image",Image1);
unsigned char * frame_in;
unsigned char * frame_out;
frame_in = (unsigned char *)malloc(height*width*3*sizeof(unsigned char));
frame_out = (unsigned char *)malloc(height*width*3*sizeof(unsigned char));
/* Load Image to frame_in */
for(int i=0 ; i<height*width*3 ; i++)
{
frame_in[i] = Image1->imageData[i];
}
tran(frame_in, frame_out, height, width, degree); //转置
/* 从frame_out存回Image1 */
for(int i=0 ; i<height*width*3 ; i++)
{
Image1->imageData[i] = frame_out[i];
}
cvNamedWindow("Result", CV_WINDOW_AUTOSIZE);
cvShowImage("Result",Image1);
cvWaitKey(0);
free(frame_in);
free(frame_out);
return 0;
}
补充说明(Supplement):
暂时无,有会在下方回覆,谢谢此版
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 27.247.13.49
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1497497828.A.5F6.html
1F:推 libertyleave: 你 转置 function 中, i,j 似乎没有给初始值就拿来06/15 13:13
2F:→ libertyleave: 用了, 这样你 x1 y1 的给array用可能会有问题06/15 13:14
3F:→ libertyleave: 你回圈是用x,y 看不出来 i j是哪里来的06/15 13:16
目前显示的问题是卡在长宽那块 数字无法存入array
※ 编辑: amateuruser (140.124.249.51), 06/15/2017 15:02:16
4F:推 libertyleave: 因为你 tran(...) 里面有问题呀06/15 15:05
5F:→ libertyleave: 还有像你有一个 if理面是06/15 15:06
6F:→ libertyleave: frame_out[(y*width+x)*3+z] = fram_in[...]06/15 15:07
7F:→ libertyleave: 到了 else 中是06/15 15:07
8F:→ libertyleave: frame_out[(y*width+i)*3+z] = 006/15 15:08
9F:→ libertyleave: x 怎麽会变成 i 了06/15 15:08
10F:→ libertyleave: 如果你是指 frame_in[i] = Image1->imageData[i]06/15 15:10
11F:→ libertyleave: 存不进去 你要确定 Image1->imageData[] 的大小有到06/15 15:11
12F:→ libertyleave: hight*width*3 呀 话说为甚麽要*306/15 15:12
13F:→ libertyleave: 我觉得 Image1->imageData[] 的大小应该只会有长X宽06/15 15:13
14F:推 Zero0910: opencv不是有提供旋转的函式 还是你是要练习? :p06/15 17:16
15F:→ Zero0910: *3是因为RGB吧 虽然应该是这样写:(y*width*3+x)+z06/15 17:18
16F:→ Zero0910: 然後直接用width不太对 因为opecv在配记忆体会帮你align06/15 17:20
17F:→ Zero0910: 正确应该用(y*image1->widthStep+x)+z (假设为8bit的图)06/15 17:21
我是存粹要练习 因为有考虑以这个程式码为依据 做基本影像处理
※ 编辑: amateuruser (140.124.249.31), 06/15/2017 18:26:21